【问题标题】:In an Editor Template call another Editor Template with the same Model在一个编辑器模板中调用另一个具有相同模型的编辑器模板
【发布时间】:2011-10-12 07:22:45
【问题描述】:

我有一个编辑器模板,我想在该编辑器模板中调用另一个具有相同模型(即嵌套)的编辑器模板,但它似乎没有显示。
IE。 \EditorTemplates\Template1.cshtml

@model foo

// insert code here to edit the default fields.

// display extra fields via another editor template.
@Html.EditorForModel("Template2")   // or @Html.EditorFor(m => m, "Template2")

和\EditorTemplates\Template2.cshtml

@model foo

@Html.TextBoxFor(m => m.Name)

我相信有人会问为什么?好吧,嵌套模板只有在满足条件时才会显示(即。@if (@Model.IsConditionMet) { .... } ),但为了简单起见,我将其排除在原型之外。

【问题讨论】:

  • 我正在尝试做类似的事情,但无济于事。自从你写了这篇文章后运气好吗?
  • 其实,后续信息:我正在尝试结合 Telerik 的 MVC 网格控件来执行此操作。这也可能与它有关。
  • @kdawg - 不,很抱歉。我已经转向 JQuery 模板和 Knockoutjs。
  • 哈!我在说 Telerik 网格控件的向导控件中使用了 knockout.js。喜欢那个图书馆。感谢您的回复。

标签: asp.net-mvc razor nested editortemplates display-templates


【解决方案1】:

简答:

请改用Html.Partial

所以,在您的 Template1.cshtml 文件中:

@model foo

// insert code here to edit the default fields.

// display extra fields via another editor template.
@Html.Partial("EditorTemplates/Template2", Model)

长答案:

可悲的是,这似乎是设计使然。 MVC 会跟踪已经渲染过的模型,如果你的模型已经被某个模板渲染过,它就不会做两次,即使模板不同。因此,为什么第二个 @Html.EditorForModel("Template2") 什么都不做。

具体来说,它是在ViewData.TemplateInfo.VisitedObjects 中跟踪的,这是一个内部字段,所以你在事后修改它是没有希望的。该字段的目的是防止无限递归。高贵,但令人讨厌的是它没有考虑使用的模板。

我通过查看source code 发现了这一点,这对于发现这些奇怪的 MVC 特性非常有用。

【讨论】:

  • 很遗憾我们不能投票标记为答案。感谢您的研究。
猜你喜欢
  • 2013-06-13
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多