使用EditorFor输出派生类型的模型的字段

时间:2013-09-27 13:18:06

标签: asp.net-mvc-4

class A {}
class B : A {}

我有一个A的模板,可以像这样使用......

EditorFor(m => m.MyA)

A也可以是B,因此在A的模板中我想要输出额外的B字段,如果绑定的项目是B 1}}。

所以在我的A模板中:

@{
  Html.EditorFor(i => i as B);
}

...给出

  

模板只能用于字段访问,属性访问,   单维数组索引或单参数自定义索引器   表达式。

我尝试使用以下输出字段除了表单元素名称之外没有父元素的前缀。

@{
  Html.RenderPartial("~/Views/B.cshtml", Model as B, new ViewDataDictionary());
}

2 个答案:

答案 0 :(得分:2)

如果您仍想要编辑模板路线,还有另一种解决方案。您可以为每种类型创建模板,仅显示该类型的字段。然后创建一个调用EditorFor的帮助器,向其传递一个基本类型名称的模板名称,并将其添加到此类型的EditorFor调用中。

型号:

public class ModelA
{
    public string PropA { get; set; }
}

public class ModelB : ModelA
{
    public string PropB { get; set; }
}

ModelA 的模板:

@model MvcTest.Models.ModelA
@Html.EditorFor(m => m.PropA)

ModelB 的模板:

@model MvcTest.Models.ModelB
@Html.EditorFor(m => m.PropB)

助手:

public static MvcHtmlString EditorForDerived<TModel, TValue>(this HtmlHelper<TModel> helper
    , Expression<Func<TModel, TValue>> expression)
{
    var baseHtml = helper.EditorFor(expression, helper.ViewData.Model.GetType().BaseType.Name);
    var derivedHtml = helper.EditorFor(expression);
    return new MvcHtmlString(baseHtml.ToHtmlString() + derivedHtml.ToHtmlString());
}

查看:

@model MvcTest.Models.ModelB
@Html.EditorForDerived(m => m)

生成此输出:

<input class="text-box single-line" id="PropA" name="PropA" type="text" value="valA" />
<input class="text-box single-line" id="PropB" name="PropB" type="text" value="valB" />

答案 1 :(得分:1)

这有效......

@Html.Partial("~/Views/B.cshtml", Model as B, new ViewDataDictionary(ViewData)
{
    Model = Model as B
});