C# EditorTemplate继承-有办法吗

C# EditorTemplate继承-有办法吗,c#,asp.net-mvc,razor,mvc-editor-templates,C#,Asp.net Mvc,Razor,Mvc Editor Templates,EditorTemplates很好,因为它们允许razor视图中存在某种“多态性”。但我缺少一块“砖”来完成多态性支持: 特殊类型的EditorTemplate能否继承常规类型的EditorTemplate 长版本: 给定 和两个编辑器模板 @* GeneralChild.cshtml *@ @model GeneralChild <span>GeneralChild</span> @* SpecialChild.cshtml *@ @model Special

EditorTemplates很好,因为它们允许razor视图中存在某种“多态性”。但我缺少一块“砖”来完成多态性支持:

特殊类型的EditorTemplate能否继承常规类型的EditorTemplate


长版本:

给定

和两个编辑器模板

@* GeneralChild.cshtml *@

@model GeneralChild
<span>GeneralChild</span>


@* SpecialChild.cshtml *@

@model SpecialChild
<span>SpecialChild is a</span> <span>GeneralChild</span>
然后我调用它,而不是
EditorFor

@SpecialChildEditorFor(m => m.ASpecialChild)
但当然,这缺少了最初提到的全部优点——我不能简单地将此代码段放到EditorTemplates目录中,从而“覆盖”GeneralChild.cshtml模板。此外,还需要显式地调用它(因此我们也丢失了“多态性”)。更重要的是,razor助手与Index.cshtml页面相关联: *它必须在使用它的页面中定义。 *它依赖于
表达式
来拥有与页面所需类型参数相同的类型参数。

在编辑器模板中使用,而不是
@Html.EditorFor(m=>m,…)

@model SpecialChild
@{
ViewData[“扩展”]=新的MvcHtmlString(“SpecialChild是一个”);
}
@Html.Partial(“~/Views/Shared/EditorTemplates/GeneralChild.cshtml”,Model)

看来答案真的很简单:-)简单就是最好的:-)为了它的价值,我把所有的发现,包括您的帮助,放在一篇文章中:
@* Index.cshtml *@

@Html.EditorFor(m => m.AGeneralChild)
// prints "<span>GeneralChild</span>", however

@Html.EditorFor(m => m.ASpecialChild)
// prints "<span>SpecialChild is a</span> <span>GeneralChild</span>"
@* SpecialChild.cshtml *@

baseEditorFor()

@section SpecificPart
{
    <span>SpecialChild is a </span>
}


@* GeneralChild.cshtml *@

@Html.RenderSection("SpecificPart") <span>GeneralChild</span>
@model GeneralChild
@{
    var extend = ViewData.ContainsKey("Extend")
        ? (MvcHtmlString)ViewData["Extend"]
        : null;
}

@if (extend != null) { @extend }
<span>GeneralChild</span>
@model SpecialChild
@Html.EditorFor(
    m => m,         // call editor for my model
    "GeneralChild", // but call "base" instead of "this"
    new
    {
        // Hand the HTML to insert as ViewData parameter
        Extend = new MvcHtmlString("<span>SpecialChild is a </span>")
    })
@helper SpecialChildEditorFor(Expression<Func<Parent,SpecialChild>> expression)
{
    @Html.EditorFor(
        expression,
        "GeneralChild",
        new { Extend = new MvcHtmlString("<span>SpecialChild is a </span>") })
}
@SpecialChildEditorFor(m => m.ASpecialChild)
@model SpecialChild
@{
    ViewData["Extend"] = new MvcHtmlString("<span>SpecialChild is a </span>");
}
@Html.Partial("~/Views/Shared/EditorTemplates/GeneralChild.cshtml", Model)