How to convert http request to the correct object?

In my ASP.Net MVC3 project, I created a ModelBinder that binds the basemodel. In my view, I am creating an object from a model that inherits my base model. Now I don’t know which model was created through reflection in my ModelBinder when I press the submit button, but how?

ModelBinder:

public class MBTestBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { //need to know which Model was created -> convert into the right object //reflection? } } 

Models:

 [ModelBinder(typeof(MBTestBinder))] public class MBTest { public string Name { get; set; } public MBTest() {} } public class MBAbl : MBTest { public MBAbl() {} public string House { get; set; } } 

View:

 @model ModelBinderProject.Models.MBTest @using (Html.BeginForm("Index", "Home")) { <fieldset> <div class="editor-field"> @Html.EditorForModel(Model) </div> <p> <input type="submit" value="Create" /> </p> </fieldset> 

Controller:

 public ActionResult Create(MBTest testItem) { //on init get a view from a class that hast inherit the class MBTest if (testItem.Name == null ) testItem = new MBAbl(); return View(testItem); } 

edit:

with bindingContext.ValueProvider.GetValue("House") I can get the form value, but bindingContext.ModelType thinks my MBTest model

+4
source share
3 answers

Finally, I solved it using a workaround bearing the model name in my model and dynamically create the correct model in modelbinder. If you know the best plz solution, show me :-)

HomeController:

 // CREATE public ActionResult About(MBTest testItem) { if (testItem == null) { testItem = new MBAbl(); testItem.Model = "MBAbl"; } return View(testItem); } 

Models:

 public class MBTest { public MBTest() {} [HiddenInput] public string Model { get; set; } public string Name { get; set; } } public class MBAbl : MBTest { public MBAbl() {} public string House { get; set; } } public class MBAb2 : MBTest { ... } 

ModelBinder:

 public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { if (controllerContext == null) throw new ArgumentNullException("controllerContext"); if (bindingContext == null) throw new ArgumentNullException("bindingContext"); //string 'Model' is needed in the base class var modelType = bindingContext.ValueProvider.GetValue("Model"); if (modelType != null && !string.IsNullOrEmpty(modelType.AttemptedValue)) { string projectName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; Type classtype = Type.GetType(string.Format("{0}.Models.{1}", projectName, modelType.AttemptedValue)); PropertyInfo[] properties = classtype.GetProperties(); var classObject = classtype.GetConstructor(new Type[] { }).Invoke(null); foreach (PropertyInfo propertie in properties) { var value = bindingContext.ValueProvider.GetValue(propertie.Name).AttemptedValue; classtype.GetProperty(propertie.Name).SetValue(classObject, value, null); } return classObject; } return null; } 
0
source

Check out the ModelBindingContext documentation.

Edited based on comments

 public class MBTestBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var result = bindingContext.ValueProvider.GetValue("Name"); if (result == null || string.IsNullOrEmpty(result.AttemptedValue)) return new MBAbl(); else return new MBTest(); } } 
0
source

Try the following:

 public class ModelBinder : DefaultModelBinder, IModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var typeValue = bindingContext.ValueProvider.GetValue("ModelType"); var type = Type.GetType("Namespace.ab" + typeValue.AttemptedValue.ToString()); var model = Activator.CreateInstance(type); //Change the model bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type); bindingContext.ModelMetadata.Model = model; //Here, we used the default model binder of the mvc return base.BindModel(controllerContext, bindingContext);; } } 
0
source

All Articles