asp.net-mvc C LabelFor和TextBoxFor不生成相同的id
<%: Html.LabelFor(x => x.Localizations["en"]) %> => Localizations[en]
<%: Html.TextBoxFor(x=> x.Localizations["en"
使用以下代码时,字段的id和标签的for属性中的id不相同. <%: Html.LabelFor(x => x.Localizations["en"]) %> => Localizations[en] <%: Html.TextBoxFor(x=> x.Localizations["en"]) %> => Localizations_en_ <%: Html.LabelFor(x => x.Localizations["en"].Property) %> => Localizations[en]_Property <%: Html.TextBoxFor(x=> x.Localizations["en"].Property) %> => Localizations_en__Property 我在反射器中跟踪代码,发现生成值的方式不同.不使用相同的帮助方法. LabelFor使用HtmlHelper.GenerateIdFromName和TextBoxFor使用TagBuilder#GenerateId. 有没有人知道这个的原因,或解决方法(除了编写你自己的整套输入/ textarea /选择助手)?或者这是一个错误? 更新: 因为我总是使用标签文本的第二个参数为标签使用html帮助器,我修改它以使用与表单字段助手相同的id生成代码. public static MvcHtmlString LabelFor<TModel,TValue>(this HtmlHelper<TModel> helper,Expression<Func<TModel,TValue>> expression,string labelText) { // The main part of this code is taken from the internal code for Html.LabelFor<TModel,TValue>(...). var metaData = ModelMetadata.FromLambdaExpression(expression,helper.ViewData); var fieldName = ExpressionHelper.GetExpressionText(expression); TagBuilder builder = new TagBuilder("label"); // Generate the id as for the form fields (adds it to self). builder.GenerateId(fieldName); // Use the generated id for the 'for' attribute. builder.Attributes.Add("for",builder.Attributes["id"]); // Remove the id again. builder.Attributes.Remove("id"); builder.SetInnerText(labelText); return MvcHtmlString.Create(builder.ToString()); }这解决了我的直接问题,但它没有回答为什么实现看起来像在MVC2中的问题.如果有原因的话. 顺便说一下:没有必要在HTML5中实际修改id / for属性,因为如果你愿意的话,让id看起来像^[]是完全合法的.所有主流浏览器都支持它. Mathias Bynens很好地解释了这一点. 更新2: 这实际上并不能解决问题,因为DefaultModelBinder无论如何都无法绑定它. MVC 2中的字段名称生成器似乎不支持在字典中使用嵌套对象,因为它生成: <input type="text" name="Dict[en]" value="(VALUE)">而不是模型绑定器想要的东西: <input type="hidden" name="Dict[0].Key" value="en"> <input type="text" name="Dict[0].Value" value="(VALUE)">奇怪的是它以这种方式开箱即用. 我已经尝试为它创建一个自定义模型绑定器,但无论我尝试使用它,我都无法使用MVC2: ModelBinders.Binders.Add(typeof(IDictionary<string,object>),new DictionaryModelBinder()); ModelBinders.Binders.Add(typeof(IDictionary<string,string>),new DictionaryModelBinder()); ModelBinders.Binders.Add(typeof(IDictionary),new DictionaryModelBinder()); ModelBinders.Binders.Add(typeof(Dictionary),new DictionaryModelBinder());所以现在它似乎又回到手动创建带有隐藏.Key字段的名称属性值. 解决方法 这是我们计划修复下一个版本(MVC 3 RTM)的MVC3中的一个错误. LabelFor将通过tagbuilder生成’for’属性,使用与生成id相同的逻辑,以便它们排列为数组和嵌套类型.我们目前正在使用html 4.01规范生成ID,因此您不能使用以非字母开头的ID.我们将考虑标准发生变化时应采取的最佳方法. (编辑:4S站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net中js+jquery添加下拉框值和后台获取示例
- asp.net-mvc – 使用ASP.NET MVC进行项目组织的最佳实践
- asp.net-mvc – 使用Razor视图引擎 – 如何格式化十进制值以
- iis-7 C ASP 3.0应用程序对象
- asp.net – Ajax上的Identity Server 3 – 401而不是302
- ASP.NET 根据汉字获取汉字拼音的首字母(含多音字)
- asp.net-mvc – 如何使用ASP.NET MVC ApiController获取GET
- asp.net-mvc – 使用mvc的主要目的
- asp.net-web-api C 在WebApi OData中为OData服务文档基URL提
- asp.net ajax实现无刷新验证码
- asp.net – 脚本标签和链接标签进入asp:内容或外
- asp.net – 在Azure网站上启用gzip压缩
- asp.net-mvc-2 – 使用’class(或其他保留关键字
- asp.net – Umbraco CMS(.NET):加载xslt /用户控
- asp.net-mvc – 为一个MVC视图使用两个强类型模型
- ASP.NET和System.Diagnostics跟踪 – 我错过了什
- asp.net – 如何在MVC 3中设置图表系列颜色?
- ASP.NET – 可以从服务器代码触发回发吗?
- asp.net-mvc-4 C 表单身份验证:角色(MVC 4)C#
- 受asp.net MVC启发的更好的WebForms
- asp.net-core C 如何使用ASP.NET注册OData
- asp.net-mvc-3 C 如何从ASP.NET MVC#输出中
- asp.net-mvc C 已经使用相同的参数类型定义
- asp.net C MVC4 C ContextDependentView C
- ASP.Net C AJAX UpdatePanel中的Javascript
- asp.net-mvc C ASP.NET MVC中的WebApi [Fro
- asp.net-mvc C 使用AD的ASP.NET MVC表单Aut
- asp.net-mvc-4 C 在EF迁移配置类的Seed方法
- asp.net C 适用于多个用户的EWS通知中心
- asp.net-mvc C MVC应用程序中的随机数生成