2011-03-25 83 views
16

我有一個視圖模型有一個項目集合。然後,我有一個EditorFor的模板,需要爲用戶創建一個下拉列表的謹慎選擇集合中的每個項目數量有限值中的一個:在mvc 3應用程序中使用Radiobutton而不是dropdownlist?

@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有可能嗎?如果是這樣,怎麼樣?

回答

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) 

或用一個簡單的循環:

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

但有了這個,我該如何設置當前選擇的級別? (就像我對下拉列表所做的那樣) – Anders 2011-03-25 22:57:04

+1

如果Level是一個int,它將使用RadioButtonFor自動選擇 – hunter 2011-03-27 01:39:55

20

這將是一個自定義的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" /> 
} 
+1

我修改了上面的RadioButtonFor()方法以允許預先選擇一個單選按鈕項目(這只是設置checked屬性的問題):sb.Append(htmlHelper.RadioButtonFor(ex,item.Value,(item.Selected?new {Checked =「」}:null))); – BrokeMyLegBiking 2011-04-15 13:50:36

+1

這是一個壯觀的答案,謝謝! – jasongullickson 2011-07-28 19:31:16

相關問題