MVC Toolkit 部分已发现bug的根治方案 Part(1)

简介:     这里我只说MVC Toolkit。     第一因为MVC Toolkit bug确实别较多,第二因为我把整个"MVC"说多了,又会有好些朋友误解我对MVC和WebForm的看法(其实我觉得两个各有所长,没有说哪个不好的意思,但是有缺点TNT2就会尽我所发现说出来,哪怕被拍砖也算是一种交流。

    这里我只说MVC Toolkit。
    第一因为MVC Toolkit bug确实别较多,第二因为我把整个"MVC"说多了,又会有朋友误解我对MVC和WebForm的看法(其实我觉得两个各有所长,没有说哪个不好的意思,但是有缺点TNT2就会尽我所发现说出来,哪怕被拍砖也算是一种交流。顺便再次真心感谢收有与我观点碰撞出火花的朋友!)。
   
    言归正传。

    时间关系,这里只讲一个让我头痛了一晚上的bug。
    如果你使用Html.Select()的话,会发现一个很奇怪的现象:并不是所有提供的重写方案里面你都提供了htmlAttributes(用以输入onclick之类的属性),只有最有一条(6 of 6)提供了。不管怎么样,我们宽容一点,把前面的5个乖乖输完,使用htmlAttributes,这个字段我输入了这样的代码:

new { onchange = "checkMiniCycle();" }

    意思很明白,我需要在这个select被改变选项的时候,执行checkMiniCycle()这段客户端js命令。
    结果没有反应,我看了客户端的HTML源代码。我希望看到的当然是select中有这样一段:onchange = "checkMiniCycle();"。然而取而代之的是这么一串:

IsReadOnly="False" IsFixedSize="False" IsSynchronized="False" Keys="System.Collections.Hashtable+KeyCollection" Count="1" Values="System.Collections.Hashtable+ValueCollection" SyncRoot="System.Object" 


    PS:为了方便大家理解,我只把对应的这一段取出来。其实一开始我还不知道是他输出错了,以为这个是Html.Select()像服务器空间一样自动生成出来的代码,而我的onclick没有输出。通过增加参数等等测试,我发现Count="1"(上面标为红色)随之增加,于是我通过种种迹象断定它输出了整个htmlAttributes(其实就是一个HashTable)的参数,而不是htmlAttributes内部分割后的参数。这里就耽误了我半天。
    
    于是我Reflect了MVCToolkit.dll(直接找源代码也一样):


    找到了Html.Select()第六种方法的代码:


因为和代码一样,我把源代码发出来(有注释):

 1 /// <summary>
 2        /// Creates an HTML Select drop-down based on the passed-in datasource.
 3        /// </summary>
 4        /// <param name="dataSource">IEnumerable, IQueryable, DataSet, DataTable, or IDataReader</param>
 5        /// <param name="htmlName">The name of the control for the page</param>
 6        /// <param name="textField">The datasource field to use for the the display text</param>
 7        /// <param name="valueField">The datasource field to use for the the control value</param>
 8        /// <param name="selectedValue">The value that should be selected</param>
 9        /// <param name="htmlAttributes">Any attributes you want set on the select tag. Use anonymous-type declaration for this: new{class=cssclass}</param>

10          public   static   string  Select( this  HtmlHelper helper,  string  htmlName,  object  dataSource,  string  textField,
11              string  valueField,  object  selectedValue,  int  size,  bool  multiple,  object  htmlAttributes)  {
12            //input formats
13            string selectFormat = "\t<select name=\"{0}\" id=\"{0}\" {1}>" + Environment.NewLine + "{2}" + Environment.NewLine + "\t</select>";
14            string optionFormat = "\t\t<option value=\"{0}\" {1}>{2}</option>" + Environment.NewLine;
15
16            Hashtable setHash = HtmlExtensionUtility.GetPropertyHash(htmlAttributes);
17
18            //output
19            StringBuilder sbOptions = new StringBuilder();
20            DataTable tbl = MvcControlDataBinder.EvalDataSource(dataSource, textField, valueField);
21
22            //loop the source
23            foreach (DataRow dr in tbl.Rows) {
24                string selectedFlag = string.Empty;
25                string thisText = dr[1].ToString();
26                string thisValue=dr[0].ToString();
27
28                if (selectedValue != null{
29                    if (HtmlExtensionUtility.AreEqual(selectedValue, dr[0]))
30                        selectedFlag = " selected=\"true\" ";
31                }

32                sbOptions.AppendFormat(optionFormat, helper.Encode(thisValue.ToString()), selectedFlag, helper.Encode(thisText));
33            }

34
35            string attributeList = string.Empty;
36            if (setHash != null)
37                attributeList = setHash.ToAttributeList();
38
39            if (multiple)
40                attributeList += " multiple ";
41
42            if(size>0)
43                attributeList += " size= "+size.ToString();
44
45            return string.Format(selectFormat, htmlName, attributeList, sbOptions.ToString());
46        }

47

    问题就出在上面红色的两行,也不知道是我机子问题(不太可能吧)还是大家也这样,我把这些直接在aspx中输出,也是那一串乱七八糟的代码。于是确定了问题出自这里。

    我把这两行分别改成这样:

var setHash  =  htmlAttributes.ToAttributeList();

attributeList 
=  setHash;
    PS: 时间原因我没有测试上面的if判断是否多余或者是不是还有更高效的方法,这里只提供一种解决思路

    接下去编译,覆盖项目中的DLL,重新编译,运行。终于成功了!

    我举这个例子只是因为我今天就在这个Html.Select()这里被卡住了,其他的如.TextBox等等可能也存在类似的问题,在此先提供着一种解决方案。希望大家少走弯路,遇到这个问题就跳过或者用类似的方法修正

这里提供修改过Html.Select()属性bug的MVCToolkit.dll下载:
MVCToolkit.rar

    欢迎大家补充讨论^_^

 

QQ:498977166

http://szw.cnblogs.com/
研究、探讨.NET开发
转载请注明出处和作者,谢谢!

 


微信开发深度解析:微信公众号、小程序高效开发秘籍
Senparc官方教程《微信开发深度解析:微信公众号、小程序高效开发秘籍》,耗时2年精心打造的微信开发权威教程,点击这里,购买正版

 

目录
相关文章
|
8月前
|
JavaScript 前端开发 Java
MooTools、Backbone、Sammy、Cappuccino、Knockout、JavaScript MVC、Google Web Toolkit、Google Closure、Ember、Batman 以及 Ext JS。
MooTools、Backbone、Sammy、Cappuccino、Knockout、JavaScript MVC、Google Web Toolkit、Google Closure、Ember、Batman 和 Ext JS 都是 JavaScript 框架,用于开发 Web 应用程序。它们分别提供了不同的功能和特性,以帮助开发者更高效地构建和维护 Web 应用程序。
64 2
|
前端开发 .NET
一起谈.NET技术,ASP.NET MVC的全球化方案
  由于项目需要最近在学习ASP.NET MVC。在实践中,网站要支持多语言,需要全球化。在MVC下我实现了一个全球化框架,在这里与各位分享一下,不足之处也请各位看官指教。   让URL支持全球化   经常上微软网站的朋友可能很熟悉类似包含..\zh-cn\..、..\en-us\..的url形式,这就是本文要使用的全球化方案。
807 0
|
Web App开发 自然语言处理 JavaScript
|
前端开发 Java 应用服务中间件
Spring MVC环境中文件上传大小和文件类型限制以及超大文件上传bug问题
      在上一篇文章中,主要介绍了Spirng MVC环境下的正常情况下文件上传功能实现。在实际开发的时候,还会涉及到上传文件大小和类型的限制,接下来就会对Spirng MVC环境下文件上传大小和类型的限制进行介绍,还会讲解到文件上传大小tomcat服务器bug问题及解决方案。
2584 0
|
Web App开发 前端开发 .NET
|
自然语言处理 JavaScript 前端开发
ASP.NET MVC 多语言方案
原文 ASP.NET MVC 多语言方案 前言: 好多年没写文章了,工作很忙,天天加班, 每天都相信不用多久,就会升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰,想想还有点小激动~~~~ 直到后来发生了邮箱事件,我竟然忘了给邮箱密码赋值,导致遇到“邮箱不可用。
1079 0
|
自然语言处理 前端开发 .NET
asp.net MVC 3多语言方案--再次写, 配源码
之前写了一篇asp.net MVC多语言方案,那次其实是为American Express银行开发的。有许多都是刚开始接触,对其也不太熟悉。现在再回过头去看,自己做一个小网站,完全用asp.net mvc 3的技术。
1087 0
|
自然语言处理 前端开发 .NET
asp.net MVC3, webform和Unity 2实现的多语言方案
半年多没有写博了。今天稍微写点。今天写的这些东西还是在今年四到六月的时候在美国工作时获得的一点东西。公司派过去的拿工作签证在那里工作。客户是美国运通。项目是他们的一个叫Serve的电子钱包服务平台。当时主要是设计并实现MVC 3的多语言方案。
1077 0