KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I'm attempting to build a custom model binder for MVC 4 that will inherit from DefaultModelBinder . I'd like it to intercept any interfaces at any binding level and attempt to load the desired type from a hidden field called AssemblyQualifiedName . Here's what I have so far (simplified): public class MyWebApplication : System.Web.HttpApplication { protected void Application_Start() { ModelBinders.Binders.DefaultBinder = new InterfaceModelBinder(); } } public class InterfaceModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { if (bindingContext.ModelType.IsInterface && controllerContext.RequestContext.HttpContext.Request.Form.AllKeys.Contains("AssemblyQualifiedName")) { ModelBindingContext context = new ModelBindingContext(bindingContext); var item = Activator.CreateInstance( Type.GetType(controllerContext.RequestContext.HttpContext.Request.Form["AssemblyQualifiedName"])); Func<object> modelAccessor = () => item; context.ModelMetadata = new ModelMetadata(new DataAnnotationsModelMetadataProvider(), bindingContext.ModelMetadata.ContainerType, modelAccessor, item.GetType(), bindingContext.ModelName); return base.BindModel(controllerContext, context); } return base.BindModel(controllerContext, bindingContext); } } Example Create.cshtml file (simplified): @model Models.ScheduledJob @* Begin Form *@ @Html.Hidden("AssemblyQualifiedName", Model.Job.GetType().AssemblyQualifiedName) @Html.Partial("_JobParameters") @* End Form *@ The above partial _JobParameters.cshtml looks at the Model.Job 's properties and builds the edit controls, similar to @Html
Tags (comma-separated)
Save Edits
Cancel