【问题标题】:Can i call a "shared" editor template from within a "areas" editor template, for the same model?对于同一模型,我可以从“区域”编辑器模板中调用“共享”编辑器模板吗?
【发布时间】:2011-11-17 06:28:19
【问题描述】:

我有一个编辑器模板位置:

Areas/Posts/Views/Shared/EditorTemplates/Question.cshtml

我也有一个:

/Views/Shared/EditorTemplates/Question.cshtml

对于两者,模型是相同的。

我要做的是在 Posts 区域的视图中,在该区域调用我的编辑器模板,设置一些 HTML,然后返回到主共享编辑器模板。

这是Posts EditorTemplate:

@model xxx.ViewModels.QuestionViewModel
@Html.Hidden("Id", (byte)Model.QuestionType)
@Html.EditorForModel()

但它所做的只是渲染隐藏字段,而不是共享编辑器模板的内容。

如果我去掉 Posts 编辑器模板,共享的模板会正确呈现。

我猜 MVC/Razor 认为这是递归的还是什么?就像我调用同一个模板一样?

有什么办法可以告诉它去共享的吗?

基本上,我正在尝试在共享模板中重用 HTML,但注入一些我自己的偷偷摸摸的 HTML。

【问题讨论】:

    标签: asp.net-mvc-3 razor mvc-editor-templates


    【解决方案1】:

    对于给定的类型,您只能在运行时使用 1 个模板。 ASP.NET MVC 首先在区域共享模板文件夹中查找,因为它在那里找到了相应的模板,所以它会选择它并使用它。然后它会停止查找,并且您放在主共享文件夹中的模板永远不会使用。这是设计使然。

    有什么办法可以告诉它去共享的吗?

    是的,您可以明确指定模板的位置,但它不会使用您区域文件夹中的模板:

    @Html.EditorFor(x => x.Question, "~/Views/Shared/EditorTemplates/Question.cshtml")
    

    【讨论】:

    • 对于给定的类型,您只能在运行时使用 1 个模板 - 您确定吗?我在一个区域有一个模板,然后在共享文件夹中有另一个相同类型的模板。然后如果我在一个不同的区域,它将使用共享文件夹一(因为区域一不在当前区域)。所以我不认为这种说法是正确的。我认为它应该是 在给定的 Views 特定上下文中,您只能在运行时为给定类型使用 1 个模板。 或类似的东西。
    • 我可以在我的区域编辑器模板中做这样的事情,而不是从视图中指向共享的那个:@Html.EditorForModel("~/Views/Shared/EditorTemplates/Question.cshtml") 或者它是不可能同时使用?
    • 传递特定模板 @Html.EditorFor(x => x.Question, "~/Views/Shared/EditorTemplates/Question.cshtml") 是否适用于某人?我有 ASP MVC 5,但在我的情况下它不起作用。它只理解“~/Views/Shared/EditorTemplates/Answer.cshtml”的短名称,如“Answer”,在其他情况下,它会回退到区域编辑器模板。
    【解决方案2】:

    由于 shared 编辑器模板的 HTML 标记非常简单(只是呈现了一个复选框和一个标签),我将标记抽象为一个自定义 HTML 助手,然后从共享模板中调用它和我的区域模板。

    ~/Areas/Posts/Views/Shared/EditorTemplates/Question.cshtml:

    @model xxx.ViewModels.QuestionViewModel
    @Html.Hidden("Id", (byte)Model.QuestionType)
    @Html.QuestionCheckBoxForModel()
    @Html.QuestionLabelForModel()
    

    ~/Views/Shared/EditorTemplates/Question.cshtml:

    @model xxx.ViewModels.QuestionViewModel
    @Html.QuestionCheckBoxForModel()
    @Html.QuestionLabelForModel()
    

    【讨论】:

    • 您可以发布自定义 HTML 帮助程序的代码吗?这是一个有趣的解决方案。
    • @Chris - 如果你愿意,我可以,但这很简单。只需包装对@Html.CheckBoxFor@Html.LabelFor 的调用,只是为了整理模板HTML。
    • @Chris - 字面意思是:htmlHelper.CheckBoxFor(model => model.SomeProperty)htmlHelper.LabelFor(model => model.SomeProperty),因为自定义 HTML 帮助程序输入为 QuestionViewModel(例如 HtmlHelper<QuestionViewModel> htmlHelper)。现在查看我的代码,我最终将复选框和标签助手合二为一,然后调用它,例如:@Html.CheckboxAndLabelForModel()
    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多