gpt4 book ai didi

c# - View 名称参数错误的 DisplayForModel

转载 作者:行者123 更新时间:2023-11-30 16:17:20 26 4
gpt4 key购买 nike

我的显示模板“PlanAlternate”:

@model MyPlan

<div class="span4 compare-column compare-column1">

<div class="compare-row-plan">
<h3>@Model.Plan.Name</h3>
</div>

@foreach (var benefit in Model.Plan.Benefits)
{
<div class="compare-row-benefit-description">
@benefit.Description
</div>
}

<div class="compare-row-submit">
<input class="btn" type="submit" value="Apply Now" />
</div>
</div>

使用显示模板的我的 View :

@model IEnumerable<MyPlan>

<div class="span9 compare-data-wrapper">
@Html.DisplayForModel("PlanAlternate")
</div>

这会引发异常:

传入字典的模型项的类型为“System.Collections.Generic.List`1[MyPlan]”,但此字典需要一个类型为“MyPlan”的模型项。

但是,如果我将显示模板从 PlanAlternate.cshtml 重命名为 MyPlan.cshtml 并使用

@Html.DisplayForModel()

一切正常。你能帮我理解为什么会这样吗?

谢谢!

编辑:

如果我完全按照上面描述的方式操作,其中显示模板文件名与 View 模型名称匹配,但我将 View 名称(“MyPlan”)传递给 DisplayForModel,它仍然会抛出异常!调用不带参数的 DisplayForModel 有效。这对我来说似乎非常非常奇怪。几乎就像一个错误,但我确定这只是我不理解的东西。

最佳答案

DisplayForModel() (和 DisplayFor(m => m) )方法在内部使用 internal static TemplateHelpers 中的方法类(class)。代码非常复杂,我将留给您更详细地探索源代码,但总结一下会发生什么:

当你没有通过 templateName值(value),助手基本上说

为我找到与我的模型名称相匹配的 View 名称,并根据该 View 为我的集合中的每个 项目生成 html

但是当你传递一个 templateName值(value),助手基本上说

找到与 templateName 匹配的 View 并将我的集合传递给它并根据该 View 生成 html

这会导致您出现异常,因为它传递了一个 IEnumerable<MyPlan> 的模型到期望模型为 MyPlan 的 View .

这与使用 [TemplateHint] 时的效果相同属性 - 即它将模型传递给 View ,因此模型是 IEnumerable<T> , View 也必须是 @model IEnumerable<T> .

所以这是设计使然(不是错误),它确实给了你很大的灵 active (例如,允许你为同一个模型使用多个模板),尽管这种行为可能没有得到应有的充分记录.

关于c# - View 名称参数错误的 DisplayForModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17301727/

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