向DisplayFor模板传递额外的ViewData

10

我想在调用HTML助手DisplayFor时,将对象Model.AvailableVerticalTypeexpressiontemplateName一起传递。 如果不传递对象,则DisplayFor()语法如下:

@Html.DisplayFor(o => offer, MVC.Shared.Views.DisplayTemplates.OfferDetail)

OfferDetail 模板仅接受类型为 Offer 的对象:

@model DGS.DGSAPI.UI.BusinessModels.Offer

我需要一种方法将AvailableVerticleType通过ViewData发送。这可行吗?在DisplayFor()中传递ViewData的语法是什么?


1
该对象是您的模型的一部分,还是在GET方法中使用ViewBagViewData添加的?请注意,您需要使用此重载 - user3559349
Model.AvailableVerticalType 是模型的一部分。 - Multi stack
17
要通过它,您将使用 @Html.DisplayFor(o => offer, MVC.Shared.Views.DisplayTemplates.OfferDetail, new { data = Model.AvailableVerticalType } ),然后在模板中,您可以使用 (yourType)ViewData["data"] 访问它。 - user3559349
@StephenMuecke 谢谢! - Multi stack
2
@StephenMuecke,如果那是答案,请将其发布为答案。 - Kevin
2个回答

6

如用户3559349建议的那样,您可以将匿名对象传递到DisplayFor()方法中,它将成为ViewData字典的一部分。

在您的视图中:

@Html.DisplayFor(o => offer, "OfferDetail", new {AvailableVerticalType = Model.AvailableVerticalType }

在您的OfferDetail模板中:

(AvailableVerticalType)ViewData["AvailableVerticalType"]

你也可以创建一个部分视图,在其中声明一个AvailableVerticalType模型,并在主视图中引用它。

@model AvailableVerticalType


2
您可以在ViewDataDictionary中传递它,以下是示例:
// optional: if you don't want to use "AdditionalData" magic string
public static class ViewDataKeys
{
    public const string AdditionalData = "AdditionalData";
}

我们可以使用DisplayFor的第二个重载,并在ViewDataDictionary中传递附加数据: (参见此处)
@Html.DisplayFor(m => m.MyModel, new ViewDataDictionary { { ViewDataKeys.AdditionalData, "additional-value" } })

在您的DisplayFor模板中,您可以像这样访问ViewDataDictionary

@{
    string additionalData = ViewData[ViewDataKeys.AdditionalData];

    /*
     * if you need to cast the data type:
     * var additionalData = (AdditionalDataType)ViewData[ViewDataKeys.AdditionalData];
     */
}

您还可以传递多个附加数据,例如:

@Html.DisplayFor(m => m.MyModel, new ViewDataDictionary { 
    { ViewDataKeys.AdditionalData1, "additional-value1" },
    { ViewDataKeys.AdditionalData2, "additional-value2" }
})

牢记在心,将数据传递给模型始终是更好的选择。


对我来说,这有点像 XY 问题,你问题的最后一行真正触及了问题的核心。OP 正在询问 ViewData,因为他们不知道如何将数据作为模型的一部分传递。鉴于此,是否有一种方法可以扩展模型,同时仍然依赖于表达式绑定,以便 DisplayFor() 模板可以正确评估原始目标属性上的验证属性?(我不确定是否有,这就需要使用 ViewData。) - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接