Tengo una Enumeración Llamada ActionStatus que tiene 2 valores posibles open=0 y cerrado = 1

public enum ActionStatus
{
    Open,
    Closed
}

Quiero construir grupo de botones de radio en mi editar y crear vistas que utiliza la enumeración de rellenar los botones de radio con a) un valor por defecto en la vista de crear y b) la opción actualmente seleccionada en la vista de edición.

Necesito un método de extensión para esto, y que nadie ha creado ya una?

EDIT: Después de Darins la respuesta por debajo de este es mi Modelo de clase

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
}

y este es mi punto de vista

@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>

Y este es mi crear controlador de acción

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

  • Hay un camino para la recuperación de archivo de recursos para Abrir & valores Cercanos? Ex:[Pantalla(Nombre = «Abrir», ResourceType = typeof(Recursos.Global), Orden = 0)] Abrir.
InformationsquelleAutor MrBliz | 2011-04-11

2 Comentarios

  1. 79
    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());
            }
        }
    }    

    Usted también podría exigir una restricción genérica de un tipo de enumeración por este método auxiliar.

    y luego:

    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);
        }
    }

    Vista:

    @model MyViewModel
    @using (Html.BeginForm())
    {
        @Html.RadioButtonForEnum(x => x.Status)
        <input type="submit" value="OK" />
    }
    • ¿Por qué utilizar un generador de cadenas? Sólo por la facilidad de concatenación y el formato? Parece una muy onu-MVC manera de hacer las cosas.
    • El enlace a Jon Skeet blog sobre el cumplimiento de una restricción genérica de un tipo de enumeración que ya no funciona.
    • Se tomó unos minutos para averiguar la correcta using declaraciones a utilizar para HtmlExtensions código, así que he editado tu respuesta para incluirlos. Espero que no la mente.
  2. 10

    Acaba de agregar etiquetas para componentes radiobutton

        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());
        }
    }

    y el Modelo:

        public enum MeetingActionStatus                   
    {
    
        [Display(Name = "Open meeting")]
        Open,
    
        [Display(Name = "Closed meeting")]
        Closed             
    }          
    • El uso de en el modelo y en la extensión de la Display atributo es muy útil como muchas veces, la descripción de las enumeraciones no es utilizable para la muestra en su formato raw.
    • Estoy recibiendo un error » del Sistema.Web.Mvc.HtmlHelper<TModel>’ no contiene una definición para ‘RadioButtonFor’, y ningún método de extensión ‘RadioButtonFor’ aceptar un primer argumento de tipo ‘System.Web.Mvc.HtmlHelper<TModel>’
    • Pruebe «el uso de System.Web.Mvc.Html;»

Dejar respuesta

Please enter your comment!
Please enter your name here