在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扩展是一样的。这里给出基本实现:

Code
 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()的代码也发上来:

Code
/// <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。相关推荐

  1. 在ASP.NET MVC 模型中 选择最好的方法将多个model(数据模型)传递到视图

    在ASP.NET MVC 模型中 选择最好的方法将多个model(数据模型)传递到视图 前提介绍 这个文章我们要讨论,在ASP.NET MVC模型的项目中,怎么选择一个最有效的方式来将多个数据模型(m ...

  2. 【初学者指南】在ASP.NET MVC 5中创建GridView

    介绍 在这篇文章中,我们将会学习如何在 ASP.NET MVC 中创建一个 gridview,就像 ASP.NET Web 表单中的 gridview 一样.服务器端和客户端有许多可用的第三方库,这些 ...

  3. ASP.NET MVC如何使用Ajax的辅助方法

    前言:前面我们已经简单的介绍过了MVC如何Jquery,因为我们如果使用Ajax的话必须要了解Jquery,这篇博客我们将大致了解一下ASP.NET MVC如何使用Ajax的辅助方法,此博客是我的读书 ...

  4. C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)),不对的地方欢迎指出与交流. 章节出自<Professional C# ...

  5. ajax调用fastreport,使用Ajax更新ASP.Net MVC项目中的报表对象

    Ajax技术显著加快了Web应用程序的速度.另外,视觉效果方面也有提升.大家都同意,每次点击按钮时整个页面都会被刷新这一点不太友好.如果你的网速不是很快,那么这个过程会很烦人,因为所有的元素都会先消失 ...

  6. 在ASP.NET MVC应用中开发插件框架(中英对照)

    [原文] Developing a plugin framework in ASP.NET MVC with medium trust [译文] 在ASP.NET MVC应用中开发一个插件框架 I'v ...

  7. 使用Donut Caching和Donut Hole Caching在ASP.NET MVC应用中缓存页面

    使用Donut Caching和Donut Hole Caching在ASP.NET MVC应用中缓存页面 使用Donut Caching和Donut Hole Caching在ASP.NET MVC ...

  8. ASP.net mvc开发中使用纯html如何创建FCKeditor编辑器的使用

    http://www.cnblogs.com/esshs/archive/2008/12/03/1346326.html FCKeditor下载路径: http://sourceforge.net/p ...

  9. 使用ASP.NET MVC Futures 中的异步Action

    在ASP.NET MVC中使用异步是比较麻烦的,从RC1版开始ASP.NET MVC Futures中提供了几个支持异步的类. 相关的类有:AsyncActionDescriptor.AsyncCon ...

最新文章

  1. Python从入门到项目实践(明日科技 吉林大学出版社)
  2. MySQL 按指定字段自定义列表排序
  3. Java字符与数字的计算
  4. Java文件File操作一:文件的创建和删除
  5. wxpython开发教程_wxpython入门第十步(应用程序框架)
  6. C#对接中国移动短信接口
  7. 说说 SpringMVC 工作原理
  8. ipmitool 远程操作BMC控制服务器
  9. Unity 实时显示FPS——移动端测试神器
  10. android读取剪切板的方法,Android获取粘贴板内容
  11. win7设置文件夹共享 win7共享文件夹
  12. 他把科学,放进几代人的中二梦
  13. Docker - 常见操作命令篇
  14. 数据集成是开放数据库还是接口?
  15. RPM REBUILD
  16. matlab电路元件二极管,(强烈推荐)基于Matlab的电子线路的设计与仿真_毕业论文
  17. Jason Brown的R快速入门方法
  18. 计算机无法保存其他共享用户,Win7共享打印机出现 无法保存打印机设置 操作无法完成 错误0x000006d9解决方法...
  19. 【收藏】2018年不容错过的20大人工智能/机器学习/计算机视觉等顶会时间表
  20. Qt下简单WebSocket网络聊天服务器

热门文章

  1. 常见的数据库端口及查询方法
  2. [LeetCode]题解(python):153-Find Minimum in Rotated Sorted Array
  3. logrotate 不轮询
  4. 编译安装openresty+mariadb+php7
  5. jQueryDOM操作
  6. explicit关键字
  7. apache+svn
  8. 防止******ADSL的一些技巧
  9. shell中数值比较 字符串比较 文件判断 whle和for和until循环
  10. 自定义PointViewPager依赖库