将枚举传递给html.radiobuttonfor MVC3
我有一个被称为ActionStatus的枚举有2个可能的值打开= 0和closures= 1
public enum ActionStatus { Open, Closed }
我想在我的编辑中创build单选button组,并创build视图,使用该枚举来填充单选button,其中a)创build视图中的默认值和b)编辑视图中当前选定的选项。
我需要一个扩展方法,并有任何人已经创build一个?
编辑:在Darins的答案下面这是我的模型类
namespace Actioner.Models { [MetadataType(typeof(MeetingActionValidation))] public class MeetingAction { [Key] public int MeetingActionId { get; set; } [Required] [Display(Name = "Description")] public string Description { get; set; } [Required] [Display(Name = "Review Date")] public DateTime ReviewDate { get ;set; } public int Status{ get; set; } [ScaffoldColumn(false)] public int MeetingId { get; set; } //public virtual Meeting Meeting { get; set; } //public virtual ICollection<User> Users { get; set; } public virtual ICollection<ActionUpdate> ActionUpdates { get; set; } public MeetingActionStatus ActionStatus { get; set; } } public enum MeetingActionStatus { Open, Closed }
这是我的看法
@model Actioner.Models.MeetingAction @using Actioner.Helpers <div class="editor-label"> @Html.LabelFor(model => model.Description) </div> <div class="editor-field"> @Html.EditorFor(model => model.Description) @Html.ValidationMessageFor(model => model.Description) </div> <div class="editor-label"> @Html.LabelFor(model => model.ReviewDate) </div> <div class="editor-field"> @Html.EditorFor(model => model.ReviewDate) @Html.ValidationMessageFor(model => model.ReviewDate) </div> <div class="editor-label"> @Html.LabelFor(model => model.Status) </div> <div class="editor-field"> @Html.RadioButtonForEnum(x => x.ActionStatus) </div>
这是我的创build控制器操作
public virtual ActionResult Create(int id) { var meetingAction = new MeetingAction { MeetingId = id, ReviewDate = DateTime.Now.AddDays(7) }; ViewBag.Title = "Create Action"; return View(meetingAction); }
枚举在视图中显示正常,但当前选定的选项不会持久化到数据库
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Html; namespace YourNamespace { public static class HtmlExtensions { public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression ) { var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); var names = Enum.GetNames(metaData.ModelType); var sb = new StringBuilder(); foreach (var name in names) { var id = string.Format( "{0}_{1}_{2}", htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix, metaData.PropertyName, name ); var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString(); sb.AppendFormat( "<label for=\"{0}\">{1}</label> {2}", id, HttpUtility.HtmlEncode(name), radio ); } return MvcHtmlString.Create(sb.ToString()); } } }
您也可以对此帮助器方法的枚举types强制执行通用约束 。
接着:
模型:
public enum ActionStatus { Open, Closed } public class MyViewModel { public ActionStatus Status { get; set; } }
控制器:
public class HomeController : Controller { public ActionResult Index() { return View(new MyViewModel { Status = ActionStatus.Closed }); } [HttpPost] public ActionResult Index(MyViewModel model) { return View(model); } }
视图:
@model MyViewModel @using (Html.BeginForm()) { @Html.RadioButtonForEnum(x => x.Status) <input type="submit" value="OK" /> }
只需为单选button添加标签
public static class HtmlExtensions { public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression ) { var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); var names = Enum.GetNames(metaData.ModelType); var sb = new StringBuilder(); foreach (var name in names) { var description = name; var memInfo = metaData.ModelType.GetMember(name); if (memInfo != null) { var attributes = memInfo[0].GetCustomAttributes(typeof(DisplayAttribute), false); if (attributes != null && attributes.Length > 0 ) description = ((DisplayAttribute)attributes[0]).Name; } var id = string.Format( "{0}_{1}_{2}", htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix, metaData.PropertyName, name ); var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString(); sb.AppendFormat( "<label for=\"{0}\">{1}</label> {2}", id, HttpUtility.HtmlEncode(description), radio ); } return MvcHtmlString.Create(sb.ToString()); } }
和型号:
public enum MeetingActionStatus { [Display(Name = "Open meeting")] Open, [Display(Name = "Closed meeting")] Closed }