.NET MVC里面自动绑定form表单功能(如:@Html.TextBox("Name")、@Html.Hidden("hide"),名称会自动与后台就行绑定ViewBag.Name,ViewBag,hide)很实用,但是感觉不足的就是@Html.CheckBox("check")和@Html.RadioButton("radio","1"),这两个表单只能单个进行绑定,当出现多个绑定进行选中时,用起来就相对不太方便,如下图
想要通过集合直接绑定生成需要的多个checkbox和radiobutton,并且部分处于选中状态,还好.NET的扩展方法为我们提供了方便。扩展方法就不用多说了,就是在静态类中,建立静态方法,并且第一个参数是 (this [要扩展的对象] name),
比如,你要给string类型扩展一个方法,要求当string长度超过10的时候只要截取前十个字符,当长度少于10的时候返回原字符串你可以这样:
namespace System
{
public static class StringExtension
{
public static string SubTen(this string sourceStr) {
if(!string.IsNullOrEmpty(sourceStr)&&sourceStr.Length>10){
return sourceStr.Substring(0,10);
}
return sourceStr;
}
}
}</span>
调用的时候如下所示:
string SS = "AASSSSSSSSSSSSSS";
var SSS = SS.SubTen();
这样当字符串长度大于10 的时候就会取出前十个字符。
好了,扩展方法就说到这里,现在进入正题,对HtmlHelper要扩展四个方法,分别是生成checkbox集合,checkbox单个,radio集合和radio单个。
方法如下,因为checkbox和radio只是type类型不同,因此,他们可以用同样的方法,只是传值的时候把类型传入进行判断就可以了。
private static IDictionary<string, object> CopyAll(this IDictionary<string, object> dicSor)
{
Dictionary<string, object> dicDst = new Dictionary<string, object>();
foreach (var item in dicSor)
{
dicDst.Add(item.Key, item.Value);
}
return dicDst;
}
这里的dictionary的扩展是方便循环的时候使用。
/// <summary>
/// 扩展checkbox和radio
/// </summary>
/// <param name="targtname">后台的取值</param>
/// <param name="itype">标签类型</param>
/// <param name="name">标签值name或者取后台值用到</param>
/// <param name="selectList">传入的集合</param>
/// <param name="htmlAttributes">Html标签属性</param>
/// <returns></returns>
private static MvcHtmlString RadioOrCheckBox(object targtname, string itype, string name, IEnumerable<SelectListItem> selectList, object htmlAttributes)
{
//不存在绑定值则返回空
if (string.IsNullOrEmpty(name) || (targtname == null && selectList == null))
{
return MvcHtmlString.Create("");
}
//if (htmlHelper.ViewData.ContainsKey(name)) {
// name = htmlHelper.ViewData[name].ToString();
//}
string selectValues = "";
Object selectedValues = null;
HashSet<string> ckSet = new HashSet<string>();//用于存储选定值,不添加重复项