asp.net-mvc-3 – 我是否需要在DisplayFor / EditorFor中使用该
传递给DisplayFor和EditorFor的表达式何时需要使用模型来进行数据访问?
例如,我可能有以下模型 class MyModel { IList<SubModel> Subs { get; set; } } class SubModel { string Name { get; set; } } 然后我可以使用从模型开始的完整路径来编写视图数据访问: @Html.DisplayFor(m => m.Subs[i].Name) 或者,我可能在不使用模型的视图中有这样的东西: @foreach (var item in Model.Subs) { @Html.DisplayFor(m => item.Name) } 但在上面我并没有真正使用该模型.这似乎每次我尝试都有效,但在什么条件下我可能遇到问题? EditorFor通常使用Expression将名称/ id构建到表单元素中.在指定传递给EditorFor的表达式时不使用模型是否安全? 解决方法
简短回答是 – 必须有一个模型作为参数传递给lambda方法.如果您的View没有模型并且您调用DisplayFor或EditorFor,您将看到错误消息“模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式.”
因此,您必须拥有一个模型才能使用DisplayFor,但实际上您不必使用它.例如,您可以这样做: Html.EditorFor(m => i) 在这种情况下,Html名称和id都将是“i”. 但是需要注意一些注意事项.例如,您可能希望在“共享/显示模板”或“编辑模板”文件夹中为SubModel创建强类型的局部视图.在这种情况下,您可以使用带有DisplayFor的foreach. 如果您使用的是EditorFor,并且希望已发布的字段绑定回模型,则需要使用: for (i = 0; ...) 而不是foreach,以便你的Html表单字段最终得到可绑定的名称,如Subs [1] .Name.如果您使用foreach,则所有输入都将具有相同的名称和ID,例如: id="s_Name" name="s.Name" 而使用for循环,你得到: id="SubModels_0__Name" name="SubModels[0].Name" for循环生成合法的html(唯一ID),可以反弹到服务器上的列表. 澄清一下:当您使用EditorFor或DisplayFor时,有两件事需要注意.首先,传入的表达式确定用于Html元素的字段名称.如果表达式与您的模型相关,则名称派生自模型,如上例所示.所以,如果我绑定到模型的子类: Html.DisplayFor(m => m.Submodel.Name) Html字段名称将为“Submodel.Name”,它将在回发时重新绑定到同一层次结构(请注意,您也可以使用其中一个重载方法自行设置名称). 第二个方面是您的表达式是键入的(也就是说,它解析为CLR类型或您的一个自定义类型).为了呈现该类型,MVC查找模型匹配的模板.它使用从当前View文件夹开始的路径层次结构查找其模板,然后查找共享文件夹,如果找不到自定义文件夹,则会回退到其内部模板. 所以你需要考虑这两个来实现你想要的渲染和回发绑定.但是,如果您只对显示数据感兴趣,则不必担心与您的模型匹配的Html字段名称,您可以使用任意名称或根本不使用任何名称,让MVC生成它们.但是你也应该知道Html ID应该是唯一的,就像上面的foreach例子一样,你可以得到相同的id.目前的浏览器似乎没有问题,但如果你想使用Javascript来选择id,那将会很有趣. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 从递归模型创建表单
- 是否可以实现自我更新的ASP.NET Web应用程序?
- asp.net – 使用ItemDataBound我只获得每隔一行.为什么?
- 如何使ASP.NET HTML代码不能被客户端(用户)查看
- ASP.NET中TextBox使用Ajax控件显示日期不全的问题解决方法
- asp.net-mvc-4 – WebAPI OData 5.0 Beta – 访问GlobalCon
- ASP.NET页面上的多个表单
- asp.net-mvc – 我是否真的使用ninject和NHibernate为我的模
- asp.net – 线程更新的Asp .net会话变量没有反映在Session中
- 发布一款层次下拉列表控件