MVC enum RadioButtonList helper

分享于 

6分钟阅读

Web开发

  繁體 雙語

介绍

我遇到了一个问题,我想使用单选按钮列表来选择枚举值。 i 在这里找到了一个很小的示例,但却发现它缺少几个功能。 所以。因为所有的开发者都做了修改。

代码

我将包括两组代码,以便你可以看到差异。

下面是Jon发布的原始代码块。


using System; 


using System.Collections.Generic; 


using System.Linq; 


using System.Web; 


using System.Web.Mvc; 


using System.Web.Mvc.Html; 


using System.Linq.Expressions; 


using System.Text;


namespace MVC3_RadioButtonList_Helper_Sample 


{ 


 public static class HtmlExtensions 


 { 


 public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>( 


 this HtmlHelper<TModel> htmlHelper, 


 Expression<Func<TModel, TProperty>> expression, 


 IEnumerable<SelectListItem> listOfValues) 


 { 


 var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 


 var sb = new StringBuilder();


 if (listOfValues!= null) 


 { 


 // Create a radio button for each item in the list 


 foreach (SelectListItem item in listOfValues) 


 { 


 // Generate an id to be given to the radio button field 


 var id = string.Format("{0}_{1}", metaData.PropertyName, item.Value);


 // Create and populate a radio button using the existing html helpers 


 var label = htmlHelper.Label(id, HttpUtility.HtmlEncode(item.Text)); 


 var radio = htmlHelper.RadioButtonFor(expression, item.Value, new { id = id }).ToHtmlString();


 // Create the html string that will be returned to the client 


 // e.g. <input data-val="true" data-val-required=


 //"You must select an option" id="TestRadio_1" 


 // name="TestRadio" type="radio" 


 // value="1"/><label for="TestRadio_1">Line1</label> 


 sb.AppendFormat("<div class="RadioButton">{0}{1}</div>", radio, label); 


 } 


 }


 return MvcHtmlString.Create(sb.ToString()); 


 } 


 } 


}



这是我最新的代码。


using System; 


using System.Collections.Generic; 


using System.Linq; 


using System.Web; 


using System.Web.Mvc; 


using System.Web.Mvc.Html; 


using System.Linq.Expressions; 


using System.Text;



namespace MVC3_RadioButtonList_Helper_Sample 


{ 


 public static class HtmlExtensions 


 { 


 public static IEnumerable<SelectListItem> ToSelectList(this Enum enumValue)


 {


 return from Enum e in Enum.GetValues(enumValue.GetType())


 select new SelectListItem


 {


 Selected = e.Equals(enumValue),


 Text = e.ToDescription(),


 Value = e.ToString()


 };


 }



 public static string ToDescription(this Enum value)


 {


 var attributes = (DescriptionAttribute[])value.GetType().GetField(


 value.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false);


 return attributes.Length > 0? attributes[0].Description : value.ToString();


 }



 public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(


 this HtmlHelper<TModel> htmlHelper,


 Expression<Func<TModel, TProperty>> expression,


 IEnumerable<SelectListItem> listOfValues, Position position = Position.Horizontal)


 {


 var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);


 string fullName = ExpressionHelper.GetExpressionText(expression);


 var sb = new StringBuilder();



 if (listOfValues!= null)


 {


 // Create a radio button for each item in the list 


 foreach (SelectListItem item in listOfValues)


 {


 // Generate an id to be given to the radio button field 


 var id = string.Format("rb_{0}_{1}", 


 fullName.Replace("[", "").Replace(


 "]", "").Replace(".", "_"), item.Value);



 // Create and populate a radio button using the existing html helpers 


 var label = htmlHelper.Label(id, HttpUtility.HtmlEncode(item.Text));


 //var radio = htmlHelper.RadioButtonFor(expression, item.Value, new { id = id }).ToHtmlString();


 var radio = htmlHelper.RadioButton(fullName, item.Value, item.Selected, new { id = id }).ToHtmlString();



 // Create the html string that will be returned to the client 


 // e.g. <input data-val="true" data-val-required=


 //"You must select an option" id="TestRadio_1" 


/name="TestRadio" type="radio"


 // value="1"/><label for="TestRadio_1">Line1</label> 


 sb.AppendFormat("<{2} class="RadioButton">{0}{1}</{2}>", 


 radio, label, (position == Position.Horizontal? "span" : "div"));


 }


 }



 return MvcHtmlString.Create(sb.ToString());


 } 


 }


}



差异

他的代码很好但却漏掉了一些东西。 第一种方法是生成实际项目列表的简单方法。 第二种是他没有考虑到在它的祖先中包含索引器的模型。 使用 helper 方法修复第一个方法,并使用用来查找该属性的完整名称的方法。 在确认身份名称的前提下,将"rb _"添加到确认的前面。

希望这有帮助,并感谢Jon提供了一个非常好的helper 方法来从。

历史记录

初始出版物。


相关文章