pasar enum a html.radiobuttonpara MVC3

Tengo un Enum llamado ActionStatus que tiene 2 valores posibles, open = 0 y closed = 1

public enum ActionStatus { Open, Closed } 

Quiero crear un grupo de botones de opción en mi edición y crear vistas que usen la enumeración para rellenar los botones de opción con a) un valor predeterminado en la vista de creación yb) la opción actualmente seleccionada en la vista de edición.

¿Necesito un método de extensión para esto y alguien ya ha creado uno?

EDIT: después de la respuesta de Darins debajo de esta es mi clase Model

 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 Users { get; set; } public virtual ICollection ActionUpdates { get; set; } public MeetingActionStatus ActionStatus { get; set; } } public enum MeetingActionStatus { Open, Closed } 

y este es mi punto de vista

 @model Actioner.Models.MeetingAction @using Actioner.Helpers 
@Html.LabelFor(model => model.Description)
@Html.EditorFor(model => model.Description) @Html.ValidationMessageFor(model => model.Description)
@Html.LabelFor(model => model.ReviewDate)
@Html.EditorFor(model => model.ReviewDate) @Html.ValidationMessageFor(model => model.ReviewDate)
@Html.LabelFor(model => model.Status)
@Html.RadioButtonForEnum(x => x.ActionStatus)

Y esta es mi acción crear controlador

 public virtual ActionResult Create(int id) { var meetingAction = new MeetingAction { MeetingId = id, ReviewDate = DateTime.Now.AddDays(7) }; ViewBag.Title = "Create Action"; return View(meetingAction); } 

La enumeración se muestra bien en la vista, pero la opción seleccionada actualmente no se conserva en la base de datos

 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( this HtmlHelper htmlHelper, Expression> 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( " {2}", id, HttpUtility.HtmlEncode(name), radio ); } return MvcHtmlString.Create(sb.ToString()); } } } 

También podría aplicar una restricción genérica a un tipo de enumeración para este método de ayuda.

y entonces:

Modelo:

 public enum ActionStatus { Open, Closed } public class MyViewModel { public ActionStatus Status { get; set; } } 

Controlador:

 public class HomeController : Controller { public ActionResult Index() { return View(new MyViewModel { Status = ActionStatus.Closed }); } [HttpPost] public ActionResult Index(MyViewModel model) { return View(model); } } 

Ver:

 @model MyViewModel @using (Html.BeginForm()) { @Html.RadioButtonForEnum(x => x.Status)  } 

Solo agregue tags para botones de radio

  public static class HtmlExtensions { public static MvcHtmlString RadioButtonForEnum( this HtmlHelper htmlHelper, Expression> 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( " {2}", id, HttpUtility.HtmlEncode(description), radio ); } return MvcHtmlString.Create(sb.ToString()); } } 

y el Modelo:

  public enum MeetingActionStatus { [Display(Name = "Open meeting")] Open, [Display(Name = "Closed meeting")] Closed }