C#学习教程:自定义模型绑定器继承自DefaultModelBinder我希望它拦截任何绑定级别的任何接口,并尝试从名为AssemblyQualifiedName的隐藏字段加载所需的类型。这是我到目标前停止(简化):publicclassMyWebApplication:System.Web.HttpApplication{protectedvoidApplication_Start(){”=新的ModelBindingContext(bindingContext);varitem=Activator.CreateInstance(Type.GetType(controllerContext.RequestContext.HttpContext.Request.Form["AssemblyQualifiedName"]));FuncmodelAccessor=()=>项目;context.ModelMetadata=newModelMetadata(newDataAnnotationsModelMetadataProvider(),bindingContext.ModelMetadata.ContainerType,modelAccessor,item.GetType(),bindingContext.ModelName);返回base.BindModel(controller上下文,上下文);}returnbase.BindModel(controllerContext,bindingContext);示例Create.cshtml文件(简化):@modelModels.ScheduledJob@*BeginForm*@@Html.Hidden("AssemblyQualifiedName",Model.Job.GetType().AssemblyQualifiedName)@Html.Partial("_JobParameters")@*EndForm*@_JobParameters.cshtml上面的部分查看Model.Job的属性并构建编辑控件,类似于@Html.EditorFor(),但是对于类型为ScheduledJob.Job的属性有一些额外的标记IJob(接口)。ScheduledJobsController.cs示例(简化版):[HttpPost]publicActionResultCreate(ScheduledJobscheduledJob){//这里的scheduledJob.Job不为null,只有默认值}保存表单时,正确解释对象类型并获取一个新实例,但对象的A属性未设置为适当的值。我还需要做什么来告诉默认绑定器接管指定类型的属性绑定?这篇文章告诉我,我的模型活页夹过于复杂。以下代码有效:publicclassInterfaceModelBinder:DefaultModelBinder{publicoverrideobjectBindModel(ControllerContextcontrollerContext,ModelBindingContextbindingContext){if(bindingContext.ModelType.IsInterface){TypedesiredType=Type.GetType(EncryptionService.Decrypt((string)bindingContext.ValueProvider.Get("AssemblyQualifiedName").ConvertTo(typeof(string))));bindingContext.ModelMetadata=ModelMetadataProviders.Current.GetMetadataForType(null,desiredType);}returnbase.BindModel(controllerContext,bindingContext);使用MVC4,这可以很容易地覆盖消息,如果这就是您在自定义模型活页夹中可能需要的全部内容:验证消息";DefaultModelBinder.ResourceClassKey="ValidationMessages";}然后使用以下条目创建名为ValidationMessages的资源文件:名称:FieldMustBeDate值:字段{0}必须是日期。名称:FieldMustBeNumericVALUE:字段{0}必须是数字我们这样做是因为合规性失败。我们的安全扫描不喜欢javascript注入将返回并出现在验证消息中并执行。通过使用此实现,我们覆盖了返回用户提供的值的默认消息。以上是C#学习教程:自定义模型Binder继承分享自DefaultModelBinder。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
