asp.net-mvc – MVC UpdateModel和子类与基类
我正在寻找将UpdateModel方法用于在运行时检索的Sub Class,如果有人可以了解我是否正在对其进行总体哈希和/或我是否正在尝试做是可能的.
我正在使用通用操作来控制一堆部分视图的验证;我试图摆脱每个局部视图的特定动作. 每个局部视图都有一个从基本模型派生的唯一模型: public class ModelA : ModelBase{ [Required] public string SomeStringProperty{get;set;} ... } public class ModelB : ModelBase{ [Required] public DateTime? SomeDateProperty{get;set;} ... } public class ModelBase{ public Guid InstanceId{get;set;} } 我在Action上使用FormCollection来获取提交的表单元素及其值,这包括View应该用于验证其请求的模型类型.忽略这个例子的安全含义,我知道它们,这是一个内部唯一的概念证明 [HttpPost] public ActionResult ChangeCaseState(int id,FormCollection formCollection) { Guid instanceId = new Guid(formCollection["instanceId"]); string modelType = formCollection["modelType"]; //Return a specific Model class based on the event/modelType var args = GetStateModelClass(modelType,instanceId); try { UpdateModel(args); if(Model.IsValid){ ... } catch (Exception) { return View("~/Views/Shared/StateForms/" + modelType + ".ascx",args); }... 这里是我用来返回基于传递给控制器??的modelType的Sub Class的代码. private static ModelBase StateModelClassFactory(string stateModelTypeName,Guid instanceId) { switch (stateModelTypeName) { case "modelTypeA": return new ModelA(workflowInstanceId); case "modelTypeB": return new ModelB(workflowInstanceId); ... } 因为StateModelClassFactory方法的返回类型属于基类,即使我实际上返回了一个Sub类,UpdateModel方法使用的Model Binder也仅绑定Base Class中的值. 关于如何解决这个问题的任何想法? 更新: 我创建了一个Customer Model Binder: public class CustomModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext) { 并将新的Model Binder分配给正确的Base Class,以了解更多内容: ModelBinders.Binders.Add(typeof(ModelBase),new CaseController.CustomModelBinder()); 当我调试模型绑定器并检查bindingContext时,Model属性表示正确的Sub Class,但ModelType属性是Base Class的属性.我应该考虑在BindModel方法中更改ModelType吗?如果有任何关于如何执行此操作的指针,那么ModelType上的setter似乎已经变得多余了.我还注意到Sub Class中的SomeDateProperty是在PropertyMetadata属性中的行为….看起来如此接近于我想要的行为. 解决方法
我刚遇到这个特定的问题,发现一个更好的通用方法就是将模型转换为动态,同时将其传递给UpdateModel:
[HttpPost] public ActionResult ChangeCaseState(int id,FormCollection formCollection) { ...try { UpdateModel((dynamic)args);//!!notice cast to dynamic here if(Model.IsValid){ ... } catch... 这似乎设置了我的类型的所有可用属性,无论我的变量是否与基类型相关. CodePlex中针对此问题提交了一个工作项:http://aspnet.codeplex.com/workitem/8277?ProjectName=aspnet (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – Orchard – 从主题布局中获取内容的标题
- asp.net-core-mvc-2.0 – ASP .NET Core 2 MVC错误NU1202在
- asp.net-mvc – 覆盖默认身份表名称
- asp.net – Http Handler正在iis express中工作,而不是在ii
- EF数据库初始化策略及种子数据的添加
- ASP.Net哪个用户帐户在IIS 7上运行Web服务?
- asp.net-mvc – 从当前访问者获取CultureInfo并基于此设置资
- asp.net – 如何填写一个Label.Text – 通过jQuery的属性
- asp.net – 如何在Quartz.Net中处理应用程序关闭
- .net – log4net – FileAppender在文件开头写入新条目
- asp.net – 在请求之间检索和持久化状态
- 在ASP.NET 3.5中的Response.Clear
- asp.net-identity – Web API 2和ASP Identity –
- asp.net-mvc – ASP.NET MVC 3模型的部分验证
- 在剃刀mvc 4 rc清空第一行
- asp.net-mvc – ASP.Net MVC自定义模型绑定说明
- ASP.NET MVC – 使用jQuery不显眼的验证来阻止提
- 剃刀 – MVC布局VS MVC主页
- asp.net-mvc – 在ASP.Net MVC中使用System.Guid
- asp.net – SQL Server Reporting Services – 运