2011-03-25 21 views
16

Tengo una vista donde el modelo tiene una colección de artículos. Entonces tengo una plantilla EditorFor que se encarga de la creación de una lista desplegable para que el usuario seleccione uno de un número limitado de valores para cada elemento de la colección:Radiobuttons en lugar de dropdownlist en la aplicación mvc 3?

@model Consultants.Models.ProgramSkill 
<tr> 
    <td>@Model.Program.Name 
    </td> 
     <td>@Model.Program.Category 
    </td> 
    <td> 
     @Html.DropDownListFor(model => model.Level, new SelectList(new[] { 0, 1, 2, 3, 4, 5 }, Model.Level)) 
    </td> 
</tr> 

Pero yo preferiría tener botones de radio que hacer la misma cosa , ¿es eso posible en MVC 3? ¿Si es así, cómo?

Respuesta

8
@Html.RadioButtonFor(m => m.Level, 0) 
@Html.RadioButtonFor(m => m.Level, 1) 
@Html.RadioButtonFor(m => m.Level, 2) 
@Html.RadioButtonFor(m => m.Level, 3) 
@Html.RadioButtonFor(m => m.Level, 4) 
@Html.RadioButtonFor(m => m.Level, 5) 

o con un simple bucle:

@for(int level = 0; level <= 5; level++) 
@Html.RadioButtonFor(m => m.Level, level) 
} 
+0

Pero con esto, ¿cómo establecer el nivel seleccionado en ese momento? (Como hago con la lista desplegable) – Anders

+1

If Level is a int se seleccionará automáticamente usando RadioButtonFor – hunter

20

Eso sería un candidato perfecto para un ayudante HTML personalizada:

using System.Web.Mvc; 
using System.Web.Mvc.Html; 
using System.Text; 
using System.Collections.Generic; 
using System.Linq.Expressions; 
using System; 

public static class HtmlExtensions 
{ 
    public static MvcHtmlString RadioButtonListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> ex, IEnumerable<SelectListItem> values) 
    { 
     string name = ExpressionHelper.GetExpressionText(ex); 
     var sb = new StringBuilder(); 
     int counter = 1; 
     foreach (var item in values) 
     { 
      sb.Append(htmlHelper.RadioButtonFor(ex, item.Value, new { id = name + counter.ToString()})); 
      var label = new TagBuilder("label"); 
      label.SetInnerText(item.Text); 
      label.Attributes.Add("for", name + counter.ToString()); 
      sb.Append(label.ToString()); 
      counter++; 
     } 
     return MvcHtmlString.Create(sb.ToString()); 
    } 
} 

Modelo:

public class MyViewModel 
{ 
    public IEnumerable<SelectListItem> Items { get; set; } 
    public string Level { get; set; } 
} 

controlador:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Level = "2", 
      Items = Enumerable.Range(1, 5).Select(x => new SelectListItem 
      { 
       Value = x.ToString(), 
       Text = "item " + x 
      }) 
     }; 
     return View(model); 
    } 
} 

y una vista:

@model AppName.Models.MyViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.RadioButtonListFor(x => x.Level, Model.Items) 
    <input type="submit" value="OK" /> 
} 
+1

Modifiqué el método RadioButtonFor() anterior para permitir la preselección de un elemento de botón de radio (esto es simplemente una cuestión de establecer el atributo marcado): sb.Append (htmlHelper.RadioButtonFor (ex, item.Value, (item.Selected? new {Checked = ""}: null))); – BrokeMyLegBiking

+1

¡Esta es una respuesta espectacular, gracias! – jasongullickson

Cuestiones relacionadas