If I have a view that has a model, lets say Car..
@model Project.Car
inside that view I want to create a form that sends data to a new model
Yes, you can strongly type a view to one model and POST it to another model.
In doing so you have two options:
Manually provide correct names for each input field, so that the default binder will understand it and create the model (example).
While this works, it also means you have to keep an eye on typos and you will not get any compile-time errors if you misspell a property name.
Manually create a HTML helper in the view bound to the new model type. It will then properly generate the HTML for you.
In order to construct the helper, you need a wrapper object that would expose the instance of your model in the form of the IViewDataContainer
interface. You can define that wrapper anywhere, including the model itself:
public class NewModel
{
public int ID { get; set; }
public int UserID { get; set; }
public string Description { get; set; }
public class WrapperForHtmlHelper : System.Web.Mvc.IViewDataContainer
{
public System.Web.Mvc.ViewDataDictionary ViewData { get; set; }
public WrapperForHtmlHelper(NewModel value)
{
this.ViewData = new System.Web.Mvc.ViewDataDictionary(value);
}
}
}
Then in a view you create a helper bound to an instance of NewModel
:
var ModelToPost = new YourApp.Models.NewModel() { ID = 1, UserID = 43, Description = "" }
var hlp = new HtmlHelper
(this.ViewContext,
new YourApp.Models.NewModel.WrapperForHtmlHelper(ModelToPost)
);
And then you use the helper as usual:
@hlp.HiddenFor(m => m.ID)
@hlp.HiddenFor(m => m.UserID)
@hlp.TextAreaFor(m => m.Description)
Then your PartialViewResult Add(ViewModels.NewModel model)
will properly receive the data.