Asp.net-Mvc

將枚舉傳遞給 html.radiobuttonfor MVC3

  • April 11, 2011

我有一個名為 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" />
}

引用自:https://stackoverflow.com/questions/5621013