0
class A {}
class B : A {}

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

EditorFor(m => m.MyA)

如果A要绑定的项目是.我想B在我的模板中输出额外的字段ABB

所以在我的A模板中:

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

给...

模板只能与字段访问、属性访问、一维数组索引或单参数自定义索引器表达式一起使用。

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

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

2 回答 2

2

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

楷模:

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

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

模型A的模板:

@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" />
于 2013-09-27T14:47:58.193 回答
1

这有效...

@Html.Partial("~/Views/B.cshtml", Model as B, new ViewDataDictionary(ViewData)
{
    Model = Model as B
});
于 2013-09-27T14:03:15.370 回答