加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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动作中,模型数组将正确地用正确的类型初始化。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读