【问题标题】:Using a dictionary lookup with Html.DisplayFor in an ASP.NET View在 ASP.NET 视图中使用带有 Html.DisplayFor 的字典查找
【发布时间】:2017-05-30 22:39:07
【问题描述】:

我正在学习使用 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

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>

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

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

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

将其转换为显式类型的字典也不起作用:

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

有没有办法让它工作?

【问题讨论】:

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


    【解决方案1】:

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

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

    选项 1

    代替

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

    随便用

    @ViewBag.Breeds[item.BreedId].Name
    

    或者如果您的品种名称可能包含 &lt;&amp; 字符,您可能需要对它们进行 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)
    

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 2014-04-14
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多