C# EditorTemplate继承-有办法吗
EditorTemplates很好,因为它们允许razor视图中存在某种“多态性”。但我缺少一块“砖”来完成多态性支持: 特殊类型的EditorTemplate能否继承常规类型的EditorTemplateC# 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
长版本: 给定 和两个编辑器模板
@* 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)