Asp.net-Mvc
將枚舉傳遞給 html.radiobuttonfor MVC3
我有一個名為 ActionStatus 的枚舉,它有 2 個可能的值 open=0 和 closed = 1
public enum ActionStatus { Open, Closed }我想在我的編輯中建構單選按鈕組,並創建使用枚舉來填充單選按鈕的視圖,其中 a) 創建視圖中的預設值和 b) 編輯視圖中目前選擇的選項。
我需要一個擴展方法嗎,有人已經創建了一個嗎?
編輯:在下面達林斯的回答之後,這是我的模型課
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>這是我的創建控制器動作
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()); } } }您還可以對此幫助方法的枚舉類型強制執行通用約束。
然後:
模型:
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" /> }