asp.net-mvc – 具有列表和编辑器模板的ViewModel
|
我有一个视图列出被添加到平面图的表。表派生自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-mvc – 添加视图模型类下拉列表不显示我的类
- asp.net-mvc-4 – 升级到.NET 4.5和EF 5后,“启用迁移”失败
- asp.net-mvc-4 – MVC4 RC脚本捆绑很慢
- asp.net-mvc – ASP.NET MVC本地化最佳实践?
- asp.net-mvc – ASP.NET MVC:部分知道它是否是从另一个页面
- asp.net-mvc-3 – 在MVC3中禁用HTML.TextAreaFor
- asp.net-mvc – 如何从MVC 3中的View中将List或Collection返
- asp.net – 在UpdatePanel asyncpostback后丢失的页面
- 编辑资源文件而不重新编译ASP.NET应用程序
- 为什么asp.net将页面包装在一个表单中?
