Радиокнопки вместо выпадающего списка в приложении MVC 3?
У меня есть вид, где модель имеет коллекцию предметов. Затем у меня есть шаблон EditorFor, который заботится о создании выпадающего списка для пользователя, чтобы выбрать одно из ограниченного числа значений для каждого элемента в коллекции:
@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>
Но я бы предпочел, чтобы радиокнопки делали то же самое, возможно ли это в MVC 3? Если так, то как?
2 ответа
Это было бы идеальным кандидатом для пользовательского помощника HTML:
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());
}
}
Модель:
public class MyViewModel
{
public IEnumerable<SelectListItem> Items { get; set; }
public string Level { get; set; }
}
контроллер:
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);
}
}
и вид:
@model AppName.Models.MyViewModel
@using (Html.BeginForm())
{
@Html.RadioButtonListFor(x => x.Level, Model.Items)
<input type="submit" value="OK" />
}
@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)
или с простым циклом:
@for(int level = 0; level <= 5; level++)
@Html.RadioButtonFor(m => m.Level, level)
}