为什么我不能通过 lambda 表达式参数访问模型的属性?

金正恩

考虑以下 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不能通过这样的参数?

为什么我不能通过 SSH 通过 Paramiko 从 AWS Lambda 建立到我的 EC2 的连接?

为什么我不能通过这种形式访问我的servlet?

为什么我们不能通过class-member-access表达式使用嵌套类型?

为什么我们不能通过.net中的对象访问静态方法

为什么我不能通过内部类引用访问外部类数据成员?

为什么连接到网桥的物理接口在我的情况下不能通过Internet访问?

为什么我不能通过multer访问req.body?

为什么我不能通过其IP访问Kubernetes服务?

为什么我不能通过 javascript 访问这个 cookie?

为什么我不能通过Docker访问NiFi流的开放HTTP端口?

为什么我不能通过静态IP设置Ubuntu Server 14.04访问互联网?

为什么我不能通过脚本访问HingeJoint2D?

为什么我不能通过友元函数访问类的私有值?

为什么我不能通过传入的类对象参数杀死 pthread

为什么我不能在Java 8 lambda表达式中引发异常?

为什么我不能在没有括号的情况下调用lambda表达式?

为什么我不能在Tuple.Create中使用lambda表达式?

为什么我不能通过 Vue.js 访问我的对象中动态插入的属性?

为什么不能通过泛型类型访问成员?

通过lambda表达式传递属性,并对属性进行排序

不能使用lambda表达式作为动态参数

为什么我使用 lambda 表达式而不是函数?

通过LINQ中的属性缓冲表达式(vs Lambda)

为什么给出错误表达式不能包含lambda表达式?

为什么我们不能通过未初始化的局部变量访问静态内容?

JavaScript中的奇怪示例,为什么我不能通过函数的参数重新分配全局变量的值?

为什么我不能通过模板参数声明一种朋友功能,但是可以使用别名

关于为什么我不能通过其子类型覆盖使用通用类参数的方法的说明