【问题标题】:Presenting in a view a model containing inheritance in MVC在视图中呈现包含 MVC 中的继承的模型
【发布时间】:2012-01-17 07:55:07
【问题描述】:

我有一组不同类型的“好处”,但都继承自 BaseBenefit 类。然后在视图上使用 List<BaseBenefit>。为了展示它们,这里的最佳做法是什么?

我虽然在视图中通过 if 进行检查,但这似乎违反了“愚蠢的 IU”的规则。我可以为每个好处包含一个属性,这样它就会有一个enum,因为它是真实的类型,但我仍然需要检查哪个是 if 的。

有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc model-view-controller view


    【解决方案1】:

    您可以使用显示模板。所以在主视图中:

    @Html.DisplayFor(x => x.Benefits)
    

    其中Benefits 是您的视图模型上List<BaseBenefit> 类型的属性。现在您所要做的就是为不同的可能类型定义显示模板:

    ~/Views/Shared/DisplayTemplates/SpecificBenefit1.cshtml:

    @model SpecificBenefit1
    ...
    

    ~/Views/Shared/DisplayTemplates/SpecificBenefit2.cshtml:

    @model SpecificBenefit2
    ...
    

    显示模板的位置和名称很重要。它们必须位于 ~/Views/Shared/DisplayTemplates 文件夹中,或者如果它们不会在控制器之间重用,您也可以在 ~/Views/SomeController/DisplayTemplates 文件夹中定义它们。模板的名称必须与列表中元素的类型相同。

    当您在可枚举属性的主视图中使用 DisplayFor 时,ASP.NET MVC 将自动为此列表的每个元素调用相应的显示模板。

    【讨论】:

    • 所以视图将使用真实类型,即使它获取基本类型?
    • @GuyZ,是的,ASP.NET MVC 将使用运行时类型来选择正确的显示/编辑器模板。
    猜你喜欢
    • 2014-11-03
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    相关资源
    最近更新 更多