关于ASP.NET MVC P5中CheckBox的HtmlHelper方法的bug。
在ASP.NET MVC P5中,当你使用这样的方法输出CheckBox:<%=Html.CheckBox("checkTest")%>,在浏览器上除了你期望看到的代码外,还有一个name和CheckBox相同的hidden域。这就导致了一个问题:当这个表单被提交时,hidden(name="checkTest",value="true")和input:checkbox(name="checkTest",value="false")会同时被提交,并且hidden域是强制的,导致在服务器端Request中,你得到的Request.Form["checkTest"]将可能是这样的:"false,true"。 所以在P5中使用Html.CheckBox()的时候要注意到这个bug。解决的方法很简单:不要用他。
但是如果你同时还希望用HtmlHelper偷懒的话,我这里提供了一个和P4中Html.Helper方法兼容的扩展,并且还比官方的方法更好——和label实现了绑定。
其实没有什么难度,和别的HtmlHelper扩展是一样的。这里给出基本实现:
public static class CheckBoxExtensions
{
public static string CheckBox(this HtmlHelper helper, string name, string text, string value, bool isChecked)
{
return CheckBox(helper, name, text, value, isChecked,null);
}
public static string CheckBox(this HtmlHelper helper, string name, string text, string value, bool isChecked, object htmlAttributes)
{
var setHash = htmlAttributes.ToAttributeList();
string attributeList = string.Empty;
if (setHash != null)
attributeList = setHash;
return string.Format("<input id=\"{0}\" name=\"{0}\" value=\"{1}\" {2} type=\"checkbox\" {4}/>{3}",
name, value, isChecked ? "checked=\"checked\"" : "",
string.IsNullOrEmpty(text) ? "" : string.Format("<label id=\"{0}\" for=\"{1}\">{2}</label>", name + "_label", name, text),
attributeList);
}
}
如果有朋友仔细看过P5的源码,会发现这个问题可能不只在CheckBox中发生,而是被扩大到了input标签中。写这篇文章旨在请大家留意这个bug,并且完善自己的扩展方法。
补充一下:
关于上面代码中的var setHash = htmlAttributes.ToAttributeList();中,ToAttributeList()这个扩展方法,直接复制代码的朋友可能无法一次性通过编译,是因为这个方法存在于早先ASP.NET MVC版本的Toolkit中,现在似乎已经被删除了,但这个方法确实很实用,我把这个ToAttributeList()的代码也发上来:
/// <summary>
/// Creates a simple {0}='{1}' list based on current object state.
/// </summary>
public static string ToAttributeList(this object o) {
StringBuilder sb = new StringBuilder();
if (o != null) {
Hashtable attributeHash = GetPropertyHash(o);
string resultFormat = " {0}=\"{1}\"";
foreach (string attribute in attributeHash.Keys) {
sb.AppendFormat(resultFormat, attribute.Replace("_", ""), attributeHash[attribute]);
}
}
return sb.ToString();
}
/// <summary>
/// Creates a simple {0}='{1}' list based on current object state. Ignores the passed-in string[] items
/// </summary>
/// <param name="o"></param>
/// <param name="ignoreList"></param>
/// <returns></returns>
public static string ToAttributeList(this object o, params object[] ignoreList) {
Hashtable attributeHash = GetPropertyHash(o);
string resultFormat = "{0}=\"{1}\" ";
StringBuilder sb = new StringBuilder();
foreach (string attribute in attributeHash.Keys) {
if (!ignoreList.Contains(attribute)) {
sb.AppendFormat(resultFormat, attribute, attributeHash[attribute]);
}
}
return sb.ToString();
}
关于ASP.NET MVC P5中CheckBox的HtmlHelper方法的bug。相关推荐
- 在ASP.NET MVC 模型中 选择最好的方法将多个model(数据模型)传递到视图
在ASP.NET MVC 模型中 选择最好的方法将多个model(数据模型)传递到视图 前提介绍 这个文章我们要讨论,在ASP.NET MVC模型的项目中,怎么选择一个最有效的方式来将多个数据模型(m ...
- 【初学者指南】在ASP.NET MVC 5中创建GridView
介绍 在这篇文章中,我们将会学习如何在 ASP.NET MVC 中创建一个 gridview,就像 ASP.NET Web 表单中的 gridview 一样.服务器端和客户端有许多可用的第三方库,这些 ...
- ASP.NET MVC如何使用Ajax的辅助方法
前言:前面我们已经简单的介绍过了MVC如何Jquery,因为我们如果使用Ajax的话必须要了解Jquery,这篇博客我们将大致了解一下ASP.NET MVC如何使用Ajax的辅助方法,此博客是我的读书 ...
- C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)),不对的地方欢迎指出与交流. 章节出自<Professional C# ...
- ajax调用fastreport,使用Ajax更新ASP.Net MVC项目中的报表对象
Ajax技术显著加快了Web应用程序的速度.另外,视觉效果方面也有提升.大家都同意,每次点击按钮时整个页面都会被刷新这一点不太友好.如果你的网速不是很快,那么这个过程会很烦人,因为所有的元素都会先消失 ...
- 在ASP.NET MVC应用中开发插件框架(中英对照)
[原文] Developing a plugin framework in ASP.NET MVC with medium trust [译文] 在ASP.NET MVC应用中开发一个插件框架 I'v ...
- 使用Donut Caching和Donut Hole Caching在ASP.NET MVC应用中缓存页面
使用Donut Caching和Donut Hole Caching在ASP.NET MVC应用中缓存页面 使用Donut Caching和Donut Hole Caching在ASP.NET MVC ...
- ASP.net mvc开发中使用纯html如何创建FCKeditor编辑器的使用
http://www.cnblogs.com/esshs/archive/2008/12/03/1346326.html FCKeditor下载路径: http://sourceforge.net/p ...
- 使用ASP.NET MVC Futures 中的异步Action
在ASP.NET MVC中使用异步是比较麻烦的,从RC1版开始ASP.NET MVC Futures中提供了几个支持异步的类. 相关的类有:AsyncActionDescriptor.AsyncCon ...
最新文章
- Python从入门到项目实践(明日科技 吉林大学出版社)
- MySQL 按指定字段自定义列表排序
- Java字符与数字的计算
- Java文件File操作一:文件的创建和删除
- wxpython开发教程_wxpython入门第十步(应用程序框架)
- C#对接中国移动短信接口
- 说说 SpringMVC 工作原理
- ipmitool 远程操作BMC控制服务器
- Unity 实时显示FPS——移动端测试神器
- android读取剪切板的方法,Android获取粘贴板内容
- win7设置文件夹共享 win7共享文件夹
- 他把科学,放进几代人的中二梦
- Docker - 常见操作命令篇
- 数据集成是开放数据库还是接口?
- RPM REBUILD
- matlab电路元件二极管,(强烈推荐)基于Matlab的电子线路的设计与仿真_毕业论文
- Jason Brown的R快速入门方法
- 计算机无法保存其他共享用户,Win7共享打印机出现 无法保存打印机设置 操作无法完成 错误0x000006d9解决方法...
- 【收藏】2018年不容错过的20大人工智能/机器学习/计算机视觉等顶会时间表
- Qt下简单WebSocket网络聊天服务器