我正在学习使用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)
有没有办法让它发挥作用?
答案 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)