gpt4 book ai didi

asp.net-mvc - 一个模型可以通过多个编辑器模板传递吗?

转载 作者:行者123 更新时间:2023-12-04 14:51:18 25 4
gpt4 key购买 nike

我正在尝试使用编辑器模板显示 View 模型,该编辑器模板在应用基本对象编辑器模板之前将模型包装在字段集中。

我的观点:

@model Mvc3VanillaApplication.Models.ContactModel

@using (Html.BeginForm())
{
@Html.EditorForModel("Fieldset")
}

使用字段集模板 (Views/Shared/EditorTemplates/Fieldset.cshtml):
<fieldset>
<legend>@ViewData.ModelMetadata.DisplayName</legend>
@Html.EditorForModel()
</fieldset>

它又为所有对象使用一个基本模板(Views/Shared/EditorTemplates/Object.cshtml):
@foreach (var prop in ViewData.ModelMetadata.Properties.Where(x => 
x.ShowForEdit && !x.IsComplexType && !ViewData.TemplateInfo.Visited(x)))
{
@Html.Label(prop.PropertyName, prop.DisplayName)
@Html.Editor(prop.PropertyName)
}

无论如何,这就是我的意图。问题是,当页面使用字段集和图例呈现时,没有应用对象模板,因此没有显示输入控件。

如果我将 View 更改为不指定“Fieldset”模板,那么我的模型属性将使用 Object 模板呈现,因此并不是找不到我的 Object 模板。

是否可以通过多个模板传递相同的模型?

对于它的值(value), View 模型如下所示:
namespace Mvc3VanillaApplication.Models
{
[System.ComponentModel.DisplayName("Contact Info")]
public class ContactModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
}

最佳答案

我实现了你所拥有的,并且能够重现它。我在 Object.cshtml 中设置了一个断点所以我可以检查它,当我使用字段集模板时,我突然意识到它甚至没有碰到对象模板。然后我逐步浏览了字段集模板,发现它调用模板很好,所以代码中一定发生了一些事情,阻止它显示对象模板。

我打开了MVC3 source code , 搜索 EditorForModel并找到了正确的功能。

public static MvcHtmlString EditorForModel(this HtmlHelper html) {
return MvcHtmlString.Create(TemplateHelpers.TemplateHelper(html, html.ViewData.ModelMetadata, String.Empty, null /* templateName */, DataBoundControlMode.Edit, null /* additionalViewData */));
}

显然不是这个,所以我按了 F12TemplateHelpers.TemplateHelper ,然后我又按了 F12单行调用,让您了解函数的核心。在这里,我发现了从 TemplateHelpers.cs 的第 214 行开始的一小段代码。 :
// Normally this shouldn't happen, unless someone writes their own custom Object templates which
// don't check to make sure that the object hasn't already been displayed
object visitedObjectsKey = metadata.Model ?? metadata.RealModelType;
if (html.ViewDataContainer.ViewData.TemplateInfo.VisitedObjects.Contains(visitedObjectsKey)) { // DDB #224750
return String.Empty;
}

这些注释实际上在代码中,在这里我们有您问题的答案: 一个模型可以通过多个编辑器模板传递吗? ,答案是 否* .

话虽如此,对于这种功能来说,这似乎是一个非常合理的用例,因此寻找替代方案可能值得付出努力。我怀疑一个模板化的 Razor 委托(delegate)会解决这个包装功能,所以我试了一下。
@{
Func<dynamic, object> fieldset = @<fieldset><legend>@ViewData.ModelMetadata.DisplayName</legend>@Html.EditorForModel()</fieldset>;
}

@using (Html.BeginForm())
{
//@Html.EditorForModel("Fieldset")
//@Html.EditorForModel()
@fieldset(Model)
}

还有中提琴!有效!我将把它留给你来实现它作为一个扩展(和更可重用)的方法。这是一篇关于 templated razor delegates 的简短博客文章.

* 从技术上讲,你可以重写这个函数并编译你自己的 MVC3 版本,但这可能比它的值(value)更麻烦。我们尝试在 careers 上执行此操作当我们发现 Html.ActionLink当您定义了几百条路线时,功能非常慢。其余的库存在签名问题,我们认为不值得我们现在花时间去解决并为 future 的 MVC 版本维护。

关于asp.net-mvc - 一个模型可以通过多个编辑器模板传递吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6192237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com