考虑以下 Razor 页面文件背后的代码。
public class IndexModel : PageModel
{
MovieContext Context { get; }
public IndexModel(MovieContext context)
{
Context = context;
}
public IList<Movie> Movies { get; set; }
public async Task OnGetAsync()
{
Movies = await Context.Movie.ToListAsync();
}
}
修剪后的 Razor 页面给出如下
@page
@model IndexModel
@foreach (var item in Model.Movies)
{
@Html.DisplayFor(modelItem =>item.Title)
}
仅出于学术目的,假设我不能在 lambda 表达式中捕获外部变量。
为什么我不能用
@Html.DisplayFor(modelItem => modelItem.Movies[modelItem.Movies.IndexOf(item)].Title)
代替
@Html.DisplayFor(modelItem =>item.Title)
?
助手喜欢DisplayFor
接受一个表达式参数。不是一个动作。它没有被执行;它被解析。
例如,如果你写
DisplayFor( a => a.Name );
...框架并没有只是调用a.Name
来获取值。相反,它会反映包含的表达式a.Name
并找出被引用的类型和属性。然后它查看属性的类型和属性,例如DataAnnotation属性,以确定显示属性所需的内容。
因此,您可以提供的作为参数的东西是有限的。该文档描述了如何使用它:
如果属性被输入为基本类型(整数、字符串等),则该方法呈现一个表示属性值的字符串。
如果属性类型为布尔值,则该方法为复选框呈现 HTML 输入元素。例如,名为 Enabled 的布尔属性可能会呈现如下标记:
<input class="check-box" disabled="disabled" ="checkbox" checked="checked" />
- 如果属性使用数据类型属性进行注释,则该属性指定为该属性生成的标记。例如,如果该属性使用 EmailAddress 特性进行标记,则该方法会生成包含使用 mailto 协议配置的 HTML 锚点的标记,如下例所示:
<a href='mailto:[email protected]'>[email protected]</a>
- 如果对象包含多个属性,则该方法为每个属性生成一个字符串,该字符串由属性名称的标记和属性值的标记组成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句