Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当模型为IEnumerable时,如何在asp中为标记助手使用本地化<;T>;_C#_Asp.net Core_Asp.net Core Mvc_Asp.net Core Tag Helpers - Fatal编程技术网

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用于此模型的
标记参数的最佳实践是什么

我的意思是:当模型来自type
ApplicationUser
并且我们创建了一个简单的“编辑所有数据”模型时,我们可以简单地执行如下操作:

<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>&nbsp;</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>&nbsp;</th>
    </tr>
    ....
</table>