C# 当模型为IEnumerable时,如何在asp中为标记助手使用本地化<;T>;
在我看来,该模型来自类型C# 当模型为IEnumerable时,如何在asp中为标记助手使用本地化<;T>;,c#,asp.net-core,asp.net-core-mvc,asp.net-core-tag-helpers,C#,Asp.net Core,Asp.net Core Mvc,Asp.net Core Tag Helpers,在我看来,该模型来自类型IEnumerable。将asp用于此模型的标记参数的最佳实践是什么 我的意思是:当模型来自typeApplicationUser并且我们创建了一个简单的“编辑所有数据”模型时,我们可以简单地执行如下操作: <label asp-for="Model.FirstName"></label> <input asp-for="Model.FirstName"></input> <label asp-for="Model.L
IEnumerable
。将asp用于此模型的
标记参数的最佳实践是什么
我的意思是:当模型来自typeApplicationUser
并且我们创建了一个简单的“编辑所有数据”模型时,我们可以简单地执行如下操作:
<label asp-for="Model.FirstName"></label>
<input asp-for="Model.FirstName"></input>
<label asp-for="Model.LastName"></label>
<input asp-for="Model.LastName"></input>
如何在
…
标记中使用asp for
?我遗漏了什么吗?因此,为了在这里提供答案,我们可以使用IEnumerable
的扩展方法。以上来自@jmcilhinney和@Tseng的评论帮助很大
<table>
<tr>
<th><label asp-for="First().FirstName"></label></th>
<th><label asp-for="First().LastName"></label></th>
<th> </th>
</tr>
....
</table>
....
我将用一个
if(Model!=null&&Model.Any())
来包围它,以确保它既不会抛出NullReferenceException
也不会抛出IndexOutOfRangeException
我不确定这是否真的有意义,因为对于一个项目或一个简单的模型,实际上,您正在获取指定属性的值,但您似乎在谈论获取属性的名称,这是完全不同的。@jmchiliney不,不完全不同。在asp.net core中为定义标签asp时,实际上会在标签中获得propertyname(或使用DisplayAttribute
时的本地化资源)。为
定义输入asp时,您会在输入字段中获得值。(这就是为什么我在th
中使用label
)当然!哦!错过了。我想调查的一个途径是看看DataGridView
如何从其数据源获取列标题,但这可能并不一定有用,因为WinForms数据绑定需要IList
而不仅仅是IEnumerable
。我想另一种选择可能是使用Model.FirstOrDefault()?.FirstName
,前提是该语法在该上下文中有效。唯一的问题是,如果列表为空,则会得到null
。实际上,另一个问题是,您将获得列表的多个枚举。实际上,它不执行任何枚举,因为FirstOrDefault()
不执行枚举器的任何提升,并且取决于基础类型,它的性能非常好(也就是说,如果基础类型是IList
,那么它只需要做一个列表[0]
)。但实际上,一个简单的
就足以让它工作,而不必首先获得一个实例或
(使用类名,而不是模型
属性(抱歉,不要经常使用Razor:P)即使它不是IList
,也只会从枚举表中获取第一个元素。当然,您可能对枚举器本身没有多少额外的分配,但您可以忽略这一点,除非它是一个每秒有10000个请求的热路径,我怀疑:P只要原始类型不是IQueryable
,它就应该是全部OK(枚举IQueryable
将强制它进行计算(转换为SQL并以同步方式从数据库执行/检索结果,从而在执行期间阻塞线程)
<table>
<tr>
<th><label asp-for="First().FirstName"></label></th>
<th><label asp-for="First().LastName"></label></th>
<th> </th>
</tr>
....
</table>