[英]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.