asp.net-mvc – 具有列表和编辑器模板的ViewModel
发布时间:2020-12-15 19:15:02 所属栏目:asp.Net 来源:网络整理
导读:我有一个视图列出被添加到平面图的表。表派生自TableInputModel以允许RectangleTableInputModel,CircleTableInputModel等 ViewModel有一个TableInputModel的列表,它们都是派生类型之一。 我有一个部分视图的每个派生类型,并给出一个混合派生类型的列表框
我有一个视图列出被添加到平面图的表。表派生自TableInputModel以允许RectangleTableInputModel,CircleTableInputModel等
ViewModel有一个TableInputModel的列表,它们都是派生类型之一。 我有一个部分视图的每个派生类型,并给出一个混合派生类型的列表框架知道如何渲染它们。 但是,在提交表单时,类型信息丢失。我试过一个自定义模型绑定器,但因为类型信息丢失时,它提交,它不工作… 有没有人试过这个? 解决方法
假设您有以下型号:
public abstract class TableInputModel { } public class RectangleTableInputModel : TableInputModel { public string Foo { get; set; } } public class CircleTableInputModel : TableInputModel { public string Bar { get; set; } } 和以下控制器: public class HomeController : Controller { public ActionResult Index() { var model = new TableInputModel[] { new RectangleTableInputModel(),new CircleTableInputModel() }; return View(model); } [HttpPost] public ActionResult Index(TableInputModel[] model) { return View(model); } } 现在你可以写视图。 主视图Index.cshtml: @model TableInputModel[] @using (Html.BeginForm()) { @Html.EditorForModel() <input type="submit" value="OK" /> } 和相应的编辑器模板。 ?/ Views / Home / EditorTemplates / RectangleTableInputModel.cshtml: @model RectangleTableInputModel <h3>Rectangle</h3> @Html.Hidden("ModelType",Model.GetType()) @Html.EditorFor(x => x.Foo) ?/ Views / Home / EditorTemplates / CircleTableInputModel.cshtml: @model CircleTableInputModel <h3>Circle</h3> @Html.Hidden("ModelType",Model.GetType()) @Html.EditorFor(x => x.Bar) 并且最后失去的平衡的是TableInputModel类型的自定义模型绑定器,它将使用发布的隐藏字段值来获取类型并实例化正确的实现: public class TableInputModelBinder : DefaultModelBinder { protected override object CreateModel(ControllerContext controllerContext,ModelBindingContext bindingContext,Type modelType) { var typeValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".ModelType"); var type = Type.GetType( (string)typeValue.ConvertTo(typeof(string)),true ); var model = Activator.CreateInstance(type); bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model,type); return model; } } 它将在Application_Start中注册: ModelBinders.Binders.Add(typeof(TableInputModel),new TableInputModelBinder()); 这几乎是所有。现在在Index Post动作中,模型数组将正确地用正确的类型初始化。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- asp.net – 是否可以在没有Javascript的情况下进
- ASP.NET Core rc2中的Cookie
- 在asp.net中<#eval和<#bind之间有什么区别?
- 我们可以在ASP.Net WEB API中使用存储库模式和工
- asp.net-mvc-3 – 如何使用复选框列制作MVC 3 We
- asp.net – 跟踪间歇性“对象引用未设置为对象的
- asp.net-mvc – 如何访问querystring在ASP.Net M
- asp.net-core – Microsoft Application Insight
- 使用ASP.NET/SQL Server丢失会话状态
- asp.net – 未处理的IIS异常 – 如何跟踪它
热点阅读