asp.net - for - mvc razor radio button example
¿Botones de radio en lugar de lista desplegable en la aplicación mvc 3? (2)
Eso sería un candidato perfecto para un ayudante html personalizado:
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" />
}
Tengo una vista donde el modelo tiene una colección de artículos. Luego tengo una plantilla EditorFor que se encarga de crear una lista desplegable para que el usuario seleccione uno de un número limitado de valores para cada elemento de la colección:
@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 preferiría tener botones de radio para hacer lo mismo, ¿es posible en MVC 3? ¿Si es así, cómo?
@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)
}