在ASP.NET视图中使用Html.DisplayFor进行字典查找

时间:2017-05-30 22:39:07

标签: c# asp.net asp.net-mvc dictionary

我正在学习使用ASP.NET和实体框架在C#中编写MVC网站。

但是,我正在努力编写一个可以使用Html.DisplayFor方法的字典查找。

说我有以下两种模式:

public class Dog
{
    public int Id;
    public string Name;
    public int BreedId;
    (...)
}

public class Breed
{
    public int Id;
    public string Name;
    (...)
}

然后,在控制器的某个地方,我创建一个字典,其中包含由Id编制索引的所有品种,并将其分配给ViewBag.Breeds。< / p>

Dogs/Index视图中,我使用类似的东西:

@model IEnumerable<App.Models.Dog>

<table>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @(ViewBag.Breeds[item.BreedId].Name)
            </td>
        </tr>
    }
</table>

它会按预期生成 Dogs 及其品种的表格。

但是,如果我尝试在Html.DisplayFor方法中使用字典查找,我会收到错误,因为表达式树可能不包含动态操作

@Html.DisplayFor(modelItem => ViewBag.Breeds[item.BreedId].Name)

将其转换为明确键入的字典并不起作用:

@Html.DisplayFor(modelItem => ((Dictionary<int, Breed>)ViewBag.Breeds)[item.BreedId].Name)

有没有办法让它发挥作用?

1 个答案:

答案 0 :(得分:0)

您应该查看this question,其中探讨了为什么DisplayFor具有如此有趣的语法。它不仅仅是一个接受字符串的简单函数。它接受一个表达式,它永远不会被执行但是被解析,因此Razor引擎可以找到模型的一个属性及其所有属性 - 这就是如何发现脚手架并知道如何呈现模型成员。

底线是 - 您不能在DisplayFor中放置任何旧字符串。但话说回来,你不应该 - 显示一个字符串,你不需要它。

选项1

而不是

@Html.DisplayFor(modelItem => ViewBag.Breeds[item.BreedId].Name)

只需使用

@ViewBag.Breeds[item.BreedId].Name

或者如果您的品种名称可能包含<&字符,则可能需要对它们进行HTML转义,因此请使用

@Html.Encode(ViewBag.Breeds[item.BreedId].Name)

选项2

如果您真的想利用DisplayFor和MVC脚手架,请将所需的计算字段添加到模型本身,并在视图中明确引用它。

public class Dog
{
    public int Id;
    public string Name;
    public int BreedId;

    [Display(Name = "Breed Name")]  //Optional scaffolding attributes
    public string BreedName
    {
        get 
        {
            return ViewBag.Breeds[BreedId].Name;
        }
    }
}

并在您的视图中

@Html.DisplayFor(modelItem => item.BreedName)