繁体   English   中英

在ASP.NET视图中将字典查找与Html.DisplayFor一起使用

[英]Using a dictionary lookup with Html.DisplayFor in an ASP.NET View

我正在学习使用ASP.NET和Entity Framework用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;
    (...)
}

然后,在控制器中的某个地方,我正在创建一个包含所有Breeds的字典,该字典由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)

有办法使它起作用吗?

您应该查看该问题 ,以探究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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM