有没有人为 ASP.NET MVC 实现 RadioButtonList For<T> ?

Posted

技术标签:

【中文标题】有没有人为 ASP.NET MVC 实现 RadioButtonList For<T> ?【英文标题】:Has anyone implement RadioButtonListFor<T> for ASP.NET MVC? 【发布时间】:2011-01-31 13:15:34 【问题描述】:

在 ASP.NET MVC Futures 中有一个 html.RadioButtonList 扩展方法。有没有人找到强类型版本的代码RadioButtonListFor&lt;T&gt;。在视图中看起来像这样:

<%= Html.RadioButtonListFor(model=>model.Item,Model.ItemList) %>

【问题讨论】:

这里有一个带有ajax功能的:awesome.codeplex.com 【参考方案1】:

这里是aspx页面中的用法

    <%= Html.RadioButtonListFor(m => m.GenderRadioButtonList)%>

这是视图模型

public class HomePageViewModel

    public enum GenderType
    
        Male,
        Female
    
    public RadioButtonListViewModel<GenderType> GenderRadioButtonList  get; set; 

    public HomePageViewModel()
    
        GenderRadioButtonList = new RadioButtonListViewModel<GenderType>
        
            Id = "Gender",
            SelectedValue = GenderType.Male,
            ListItems = new List<RadioButtonListItem<GenderType>>
            
                new RadioButtonListItem<GenderType>Text = "Male", Value = GenderType.Male,
                new RadioButtonListItem<GenderType>Text = "Female", Value = GenderType.Female
            
        ;
    

这是用于单选按钮列表的视图模型

public class RadioButtonListViewModel<T>

    public string Id  get; set; 
    private T selectedValue;
    public T SelectedValue
    
        get  return selectedValue; 
        set
        
            selectedValue = value;
            UpdatedSelectedItems();
        
    

    private void UpdatedSelectedItems()
    
        if (ListItems == null)
            return;

        ListItems.ForEach(li => li.Selected = Equals(li.Value, SelectedValue));
    

    private List<RadioButtonListItem<T>> listItems;
    public List<RadioButtonListItem<T>> ListItems
    
        get  return listItems; 
        set
        
            listItems = value;
            UpdatedSelectedItems();
        
    


public class RadioButtonListItem<T>

    public bool Selected  get; set; 

    public string Text  get; set; 

    public T Value  get; set; 

    public override string ToString()
    
        return Value.ToString();
    

这里是 RadioButtonListFor 的扩展方法

public static class HtmlHelperExtensions

    public static string RadioButtonListFor<TModel, TRadioButtonListValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, RadioButtonListViewModel<TRadioButtonListValue>>> expression) where TModel : class
    
        return htmlHelper.RadioButtonListFor(expression, null);
    

    public static string RadioButtonListFor<TModel, TRadioButtonListValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, RadioButtonListViewModel<TRadioButtonListValue>>> expression, object htmlAttributes) where TModel : class
    
        return htmlHelper.RadioButtonListFor(expression, new RouteValueDictionary(htmlAttributes));
    

    public static string RadioButtonListFor<TModel, TRadioButtonListValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, RadioButtonListViewModel<TRadioButtonListValue>>> expression, IDictionary<string, object> htmlAttributes) where TModel : class
    
        var inputName = GetInputName(expression);

        RadioButtonListViewModel<TRadioButtonListValue> radioButtonList = GetValue(htmlHelper, expression);

        if (radioButtonList == null)
            return String.Empty;

        if (radioButtonList.ListItems == null)
            return String.Empty;

        var divTag = new TagBuilder("div");
        divTag.MergeAttribute("id", inputName);
        divTag.MergeAttribute("class", "radio");
        foreach (var item in radioButtonList.ListItems)
        
            var radioButtonTag = RadioButton(htmlHelper, inputName, new SelectListItemText=item.Text, Selected = item.Selected, Value = item.Value.ToString(), htmlAttributes);

            divTag.InnerHtml += radioButtonTag;
        

        return divTag + htmlHelper.ValidationMessage(inputName, "*");
    

    public static string GetInputName<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression)
    
        if (expression.Body.NodeType == ExpressionType.Call)
        
            var methodCallExpression = (MethodCallExpression)expression.Body;
            string name = GetInputName(methodCallExpression);
            return name.Substring(expression.Parameters[0].Name.Length + 1);

        
        return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1);
    

    private static string GetInputName(MethodCallExpression expression)
    
        // p => p.Foo.Bar().Baz.ToString() => p.Foo OR throw...

        var methodCallExpression = expression.Object as MethodCallExpression;
        if (methodCallExpression != null)
        
            return GetInputName(methodCallExpression);
        
        return expression.Object.ToString();
    

    public static string RadioButton(this HtmlHelper htmlHelper, string name, SelectListItem listItem,
                         IDictionary<string, object> htmlAttributes)
    
        var inputIdSb = new StringBuilder();
        inputIdSb.Append(name)
            .Append("_")
            .Append(listItem.Value);

        var sb = new StringBuilder();

        var builder = new TagBuilder("input");
        if (listItem.Selected) builder.MergeAttribute("checked", "checked");
        builder.MergeAttribute("type", "radio");
        builder.MergeAttribute("value", listItem.Value);
        builder.MergeAttribute("id", inputIdSb.ToString());
        builder.MergeAttribute("name", name + ".SelectedValue");
        builder.MergeAttributes(htmlAttributes);
        sb.Append(builder.ToString(TagRenderMode.SelfClosing));
        sb.Append(RadioButtonLabel(inputIdSb.ToString(), listItem.Text, htmlAttributes));
        sb.Append("<br>");

        return sb.ToString();
    

    public static string RadioButtonLabel(string inputId, string displayText,
                                 IDictionary<string, object> htmlAttributes)
    
        var labelBuilder = new TagBuilder("label");
        labelBuilder.MergeAttribute("for", inputId);
        labelBuilder.MergeAttributes(htmlAttributes);
        labelBuilder.InnerHtml = displayText;

        return labelBuilder.ToString(TagRenderMode.Normal);
    


    public static TProperty GetValue<TModel, TProperty>(HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class
    
        TModel model = htmlHelper.ViewData.Model;
        if (model == null)
        
            return default(TProperty);
        
        Func<TModel, TProperty> func = expression.Compile();
        return func(model);
    

【讨论】:

我认为 Keltex 的意思可能是在回答帖子中,而不是在博客中。我几乎从不去第 3 方网站下载源代码,但喜欢在此处甚至博客上查看核心部分的代码示例 :) 哦,我明白了。我开始这样做,但代码变得非常大,所以我认为不值得重复。我可以看到发布代码 sn-ps 会很有用,但是对于发布在这种情况下所需的 4-5 个类可能是矫枉过正。不过,如果这是我想要的,我可以这样做。想法? SO 上的人似乎不介意冗长的答案,只要它们是描述性的(例如,请参阅***.com/questions/1863884/which-orm-supports-this/…)。话虽这么说,我相信如果你只想做单选按钮而不是它处理的多种输入类型,我相信你可以将下面我的答案中的代码压缩到大约 40 行,我相信你可以对你的做同样的事情.如果它更容易,请随意使用我的答案中的代码:) 在 MVC 应用程序中使用上述 MVVM 模式是否一致? 这似乎不适用于 MVC2,因为 htmlHelper.ValidationMessage 返回一个 MvcHtmlString,它没有为字符串实现 + 运算符。【参考方案2】:

MVC 3 示例创建 3 个带有验证的单选按钮以确保选择了 1 个选项。如果表单验证失败(例如在其他字段上),则在重新显示表单时会预先选择所选的单选选项。

查看

@Html.RadioButtonForSelectList(m => m.TestRadio, Model.TestRadioList)
@Html.ValidationMessageFor(m => m.TestRadio)

型号

public class aTest

    public Int32 ID  get; set; 
    public String Name  get; set; 


public class LogOnModel

    public IEnumerable<SelectListItem> TestRadioList  get; set; 

    [Required(ErrorMessage="Test Error")]
    public String TestRadio  get; set; 

    [Required]
    [Display(Name = "User name")]
    public string UserName  get; set; 

控制器操作

public ActionResult LogOn()
    
        List<aTest> list = new List<aTest>();
        list.Add(new aTest()  ID = 1, Name = "Line1" );
        list.Add(new aTest()  ID = 2, Name = "Line2" );
        list.Add(new aTest()  ID = 3, Name = "Line3" );

        SelectList sl = new SelectList(list, "ID", "Name");

        var model = new LogOnModel();
        model.TestRadioList = sl;

        return View(model);
    

    [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    
        if (ModelState.IsValid)
        
             ....
        

        // If we got this far, something failed, redisplay form
        List<aTest> list = new List<aTest>();
        list.Add(new aTest()  ID = 1, Name = "Line1" );
        list.Add(new aTest()  ID = 2, Name = "Line2" );
        list.Add(new aTest()  ID = 3, Name = "Line3" );

        SelectList sl = new SelectList(list, "ID", "Name");
        model.TestRadioList = sl;

        return View(model);
    

这是扩展名:

public static class HtmlExtensions

    public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression,
        IEnumerable<SelectListItem> listOfValues)
    
        var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        var sb = new StringBuilder();

        if (listOfValues != null)
        
            foreach (SelectListItem item in listOfValues)
            
                var id = string.Format(
                    "0_1",
                    metaData.PropertyName,
                    item.Value
                );

                var radio = htmlHelper.RadioButtonFor(expression, item.Value, new  id = id ).ToHtmlString();
                sb.AppendFormat(
                    "<label for=\"0\">1</label> 2",
                    id,
                    HttpUtility.HtmlEncode(item.Text),
                    radio
                );
            
        

        return MvcHtmlString.Create(sb.ToString());
    

【讨论】:

最喜欢您的解决方案的外观,非常容易集成,效果很好,谢谢! 您好,这不起作用,当像 Add ROW to table 这样的表/网格row动态添加到客户端视图中的表中 使用克隆。在 POST 操作中,该行的单选框始终为空,但其他单元格通过!【参考方案3】:

好的,我知道这不是您问题的直接答案,但无论如何这可能是进行大多数输入的更好方法(而且这样做很有趣)。我刚刚完成了这个并对其进行了少量测试,所以我不能保证这在所有情况下都是完美的。

我从 Jimmy Bogard 的帖子 here 中得到了这个想法。看看,因为那里有很多非常酷的想法。

我所做的是创建了一个“InputFor”助手,它尽最大努力找出您要求的输入并相应地输出。这将做单选按钮,但如果有两个以上,将默认为下拉,您应该能够很容易地更改此功能。

下面的代码允许您拨打电话,例如&lt;%= Html.InputFor(m =&gt; m.Gender) %&gt;&lt;%Html.InputFor(m =&gt; m.Gender, Model.GenderList)%&gt;。最后有一点很酷,它允许您按照约定进行编码,但我们稍后会谈到。

public static MvcHtmlString InputFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, object>> field, Dictionary<string, string> listing) where TModel : class
        
            string property_name = GetInputName(field);
            PropertyDescriptor descriptor = TypeDescriptor.GetProperties(helper.ViewData.Model).Find(property_name, true);
            string property_type = descriptor.PropertyType.Name;
            var func = field.Compile();
            var value = func(helper.ViewData.Model);

            //Add hidden element if required
            if (descriptor.Attributes.Contains(new HiddenInputAttribute()))
            
                return helper.Hidden(property_name, value);
            

            if (property_type == "DateTime" || property_type == "Date")
            
                return helper.TextBox(property_name, value, new  @class = "date_picker" );
            
            if (listing != null)
            
                if (listing.Count <= 2)
                
                    //This is a good length for a radio button
                    string output = "";
                    foreach (KeyValuePair<string, string> pair in listing)
                    
                        TagBuilder label = new TagBuilder("label");
                        label.MergeAttribute("for", property_name);
                        label.SetInnerText(pair.Value);
                        output += helper.RadioButton(property_name, pair.Key, (value == pair.Key)).ToHtmlString();
                        output += label.ToString();
                    
                    return MvcHtmlString.Create(output);
                
                else
                
                    //too big for a radio button, lets make a drop down
                    return helper.DropDownList(property_name, new SelectList(listing, "Key", "Value"), value);
                
            
            else
            
                if (property_type == "Boolean")
                
                    listing = new Dictionary<string, string>();
                    listing.Add("true", "Yes");
                    listing.Add("false", "No");
                    SelectList select_values = new SelectList(listing, "Key", "Value", ((bool)value ? "Yes" : "No"));
                    return helper.DropDownList(property_name, select_values);
                
                return helper.TextBox(property_name, value);
            
        

按约定编码

下面的代码允许在考虑到约定优于配置的情况下完成此操作。例如,如果您有一个模型对象,其中包含您要列出的属性(性别)和一个同名但附加了“列表”(性别列表)的字典,那么它将默认使用此列表。

例如&lt;%= Html.InputFor(m =&gt; m.Gender) %&gt; 可以创建一个完整的下拉列表/单选按钮组,但是可以通过调用 &lt;%= Html.InputFor(m =&gt; m.Gender, alternate_list) %&gt; 来覆盖这些默认值

public static MvcHtmlString InputFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, object>> field) where TModel : class

    string property_name = GetInputName(field) + "List";
    PropertyDescriptor list_descriptor = TypeDescriptor.GetProperties(helper.ViewData.Model).Find(property_name, true);
    Dictionary<string, string> listing = null;

    if (list_descriptor != null)
    
        //Found a match for PropertyNameList, try to pull it out so we can use it
        PropertyInfo temp = helper.ViewData.Model.GetType().GetProperty(property_name);
        listing = (Dictionary<string, string>)temp.GetValue(helper.ViewData.Model, null);
    
    return InputFor(helper, field, listing);

现在有点免责声明:

这不是世界上最快的代码(由于反射和其他因素),在我的情况下,这并不是真正相关的,因为它都是用户驱动的,如果你打算做一些疯狂愚蠢的事情。 此代码尚处于起步阶段,我将在接下来的几天内对其进行更彻底的测试并添加,欢迎任何改进代码的建议。

我希望这段代码对某人有用,我知道我将在接下来的几周内使用它来尝试缩短时间。减少这个只做单选按钮应该是一项微不足道的任务,祝你好运:)

【讨论】:

【参考方案4】:

基于Jon post,使用HTMLAttributes 生成单选按钮列表作为ul 的小改进

public static MvcHtmlString RadioButtonListFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression,
        IEnumerable<SelectListItem> listOfValues,
        IDictionary<string, object> radioHtmlAttributes = null,
        string ulClass = null)
    
        ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);

        if (radioHtmlAttributes == null)
            radioHtmlAttributes = new RouteValueDictionary();

        TagBuilder ulTag = new TagBuilder("ul");
        if (!String.IsNullOrEmpty(ulClass))
            ulTag.MergeAttribute("class", ulClass);

        if (listOfValues != null)
        
            // Create a radio button for each item in the list 
            foreach (SelectListItem item in listOfValues)
            

                // Generate an id to be given to the radio button field 
                var id = string.Format("0_1", metaData.PropertyName, item.Value);

                if (!radioHtmlAttributes.ContainsKey("id"))
                    radioHtmlAttributes.Add("id", id);
                else
                    radioHtmlAttributes["id"] = id;

                // Create and populate a radio button using the existing html helpers 
                var label = htmlHelper.Label(id, HttpUtility.HtmlEncode(item.Text));
                var radio = htmlHelper.RadioButtonFor(expression, item.Value, radioHtmlAttributes).ToHtmlString();

                // Create the html string that will be returned to the client 
                // e.g. <input data-val="true" data-val-required="You must select an option" id="TestRadio_1" name="TestRadio" type="radio" value="1" /><label for="TestRadio_1">Line1</label> 
                ulTag.InnerHtml += string.Format("<li>01</li>", radio, label);
            
        

        return MvcHtmlString.Create(ulTag.ToString(TagRenderMode.Normal));
    

    public static MvcHtmlString RadioButtonListFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression,
        IEnumerable<SelectListItem> listOfValues,
        object radioHtmlAttributes = null,
        string ulClass = null)
    
        return RadioButtonListFor<TModel, TProperty>(htmlHelper, expression, listOfValues, new RouteValueDictionary(radioHtmlAttributes), ulClass);
    

【讨论】:

【参考方案5】:

我在 MVC 1.0 中实现了类似的东西。看看这是否对你有帮助:

    public static string RadioButtonList2(this HtmlHelper _helper, string _name, IEnumerable<SelectListItem> _items, string _selectedValue, string _seperator)
    
        return RadioButtonList2(_helper, _name, _items, _selectedValue, _seperator, null);
    

    public static string RadioButtonList2(this HtmlHelper _helper, string _name, IEnumerable<SelectListItem> _items, string _selectedValue, string _seperator, IDictionary<string, object> _htmlAttributes)
    
        StringBuilder _outputScript = new StringBuilder();

        foreach (var item in _items)
        
            var optionField = new TagBuilder("input");
            optionField.MergeAttribute("name", _name);
            optionField.MergeAttribute("id", _name);
            optionField.MergeAttribute("class", _name);
            optionField.MergeAttribute("value", item.Value);
            optionField.MergeAttribute("type", "radio");

            // Check to see if it's checked
            if (item.Value == _selectedValue)
                optionField.MergeAttribute("checked", "checked");

            if (_htmlAttributes != null)
                optionField.MergeAttributes(_htmlAttributes);

            _outputScript.Append(optionField.ToString(TagRenderMode.SelfClosing));
            _outputScript.Append("<label style=\"display:inline;\">");
            _outputScript.Append(item.Text);
            _outputScript.Append("</label>" + _seperator);
        

        return _outputScript.ToString();
    

在控制器中,可以按如下方式返回结果:

        ViewData["GenderList"] = new SelectList(new[]  new  Value = "M", Text = "Male" , new  Value = "F", Text = "Female" , new  Value = "A", Text = "All"  , "Value", "Text");

        ViewData["GenderList"] = new SelectList(_resultFromSomeLinqQuery, "GenderID", "GenderName");

并在View中使用如下:

<%= Html.RadioButtonList2("Sex", ViewData["GenderList"] as SelectList, ViewData["SelectedSex"].ToString(), "&nbsp;")%>

您还可以将&amp;nbsp; 替换为&lt;BR /&gt; 以在单独的行中显示它们。

希望这会有所帮助。

问候 纳威德·阿克拉姆 naweed@xgeno.com

【讨论】:

很遗憾,这不是我想要的模板版本。【参考方案6】:

这是 VB 中一个稍微“苗条”的答案。 对我有用,但这不是一个完整的解决方案。

<Extension()> _
Public Function RadioButtonListFor(Of TModel, TProperty)(ByVal htmlHelper As System.Web.Mvc.HtmlHelper(Of TModel), ByVal expression As System.Linq.Expressions.Expression(Of System.Func(Of TModel, TProperty)), ByVal selectList As System.Collections.Generic.IEnumerable(Of System.Web.Mvc.SelectListItem), ByVal htmlAttributes As Object) As System.Web.Mvc.MvcHtmlString
    'Return htmlHelper.DropDownListFor(expression, selectList, htmlAttributes)
    If selectList Is Nothing OrElse selectList.Count = 0 Then Return MvcHtmlString.Empty

    Dim divTag = New TagBuilder("div")
    divTag.MergeAttributes(New RouteValueDictionary(htmlAttributes))
    Dim name = CType(expression.Body, System.Linq.Expressions.MemberExpression).Member.Name
    Dim value = expression.Compile()(htmlHelper.ViewData.Model)
    Dim sb As New StringBuilder()

    For Each item In selectList
        sb.AppendFormat("<input id=""0_1"" type=""radio"" name=""0"" value=""1"" 2 />", name, item.Value, If(item.Value = value.ToString, """checked""", ""))
        sb.AppendFormat("<label for=""0_1"">2</label>", name, item.Value, item.Text)
    Next

    divTag.InnerHtml = sb.ToString

    Return MvcHtmlString.Create(divTag.ToString)

End Function

【讨论】:

【参考方案7】:

我修改了Mac的方案,用数据库表替换了Enum类型,我的表是:

在我的应用程序中,我根据性别偏好租用房间。 我的带有 GenderRadios 属性的模型:

public partial class Room

 public RadioButtonListViewModel GenderRadios  get; set; 
 //...

在房间控制器中,我正在准备收音机:

   private void fillRadios(Room room)
             
        List<Gender> genders = fre.Genders.ToList();
        room.GenderRadios= new RadioButtonListViewModel();
        room.GenderRadios.ListItems = new List<RadioButtonListItem>();
        foreach (Gender gender in genders)
            room.GenderRadios.ListItems.Add(new RadioButtonListItem  Text = gender.Name, Value = gender.Id, Selected= (room.GenderId == gender.Id));
    

最后,我在视图中使用它来创建房间:

<tr> 
<td>Gender</td>
   <%= Html.RadioButtonListFor(m => m.GenderRadios, "GenderRadiosForRoomCreate")%>         
</tr>

编辑室:

<tr> 
<td>Gender</td>
    <%= Html.RadioButtonListFor(m => m.GenderRadios, "GenderRadiosForRoomEdit")%>         
</tr>

创建房间 html 将如下所示:

<td id="GenderRadisoForRoomCreate_Container">
<input id="GenderRadisoForRoomCreate_Any" name="GenderRadisoForRoomCreate_value" value="1" type="radio"><label for="GenderRadisoForRoomCreate_Any">Any</label>
<input id="GenderRadisoForRoomCreate_Female" name="GenderRadisoForRoomCreate_value" value="2" type="radio"><label for="GenderRadisoForRoomCreate_Female">Female</label>
<input id="GenderRadisoForRoomCreate_Male" name="GenderRadisoForRoomCreate_value" value="3" type="radio"><label for="GenderRadisoForRoomCreate_Male">Male</label>
</td>

房间创建时间:

[HttpPost]
public ActionResult RoomCreate(Room room, FormCollection formValues, int? GenderRadiosForRoomCreate_value, int? SmokingRadiosForRoomCreate_value)

    room.GenderId = GenderRadiosForRoomCreate_value;
    room.SmokingId = SmokingRadiosForRoomCreate_value;
//...

这里是助手类:

public class RadioButtonListViewModel

    public int Id  get; set; 

    private int selectedValue;
    public int SelectedValue
    
        get  return selectedValue; 
        set
        
            selectedValue = value;
            UpdatedSelectedItems();
        
    

    private void UpdatedSelectedItems()
    
        if (ListItems == null)
            return;

        ListItems.ForEach(li => li.Selected = Equals(li.Value, SelectedValue));
    

    private List<RadioButtonListItem> listItems;
    public List<RadioButtonListItem> ListItems
    
        get  return listItems; 
        set
        
            listItems = value;
            UpdatedSelectedItems();
        
    


public class RadioButtonListItem

    public bool Selected  get; set; 

    public string Text  get; set; 



    public int Value  get; set; 

    public override string ToString()
    
        return Value.ToString();
    




public static class HtmlHelperExtensions

    /* 
     tagBase: I used tagBase string for building other tag's Id or Name on this. i.e. for tagBase="GenderRadiosForRoomCreate" 
        <td id="GenderRadisoForRoomCreate_Container">
        <input id="GenderRadisoForRoomCreate_Any" name="GenderRadisoForRoomCreate_value" value="1" type="radio"><label for="GenderRadisoForRoomCreate_Any">Any</label>
        <input id="GenderRadisoForRoomCreate_Female" name="GenderRadisoForRoomCreate_value" value="2" type="radio"><label for="GenderRadisoForRoomCreate_Female">Female</label>
        <input id="GenderRadisoForRoomCreate_Male" name="GenderRadisoForRoomCreate_value" value="3" type="radio"><label for="GenderRadisoForRoomCreate_Male">Male</label>
        </td>     
    */
    public static string RadioButtonListFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, RadioButtonListViewModel>> expression, String tagBase) where TModel : class
    
        return htmlHelper.RadioButtonListFor(expression, tagBase, null);
    

    public static string RadioButtonListFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, RadioButtonListViewModel>> expression, String tagBase, object htmlAttributes) where TModel : class
    
        return htmlHelper.RadioButtonListFor(expression, tagBase, new RouteValueDictionary(htmlAttributes));
    

    public static string RadioButtonListFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, RadioButtonListViewModel>> expression, String tagBase, IDictionary<string, object> htmlAttributes) where TModel : class
            
        var inputName = tagBase;
        RadioButtonListViewModel radioButtonList = GetValue(htmlHelper, expression);

        if (radioButtonList == null)
            return String.Empty;

        if (radioButtonList.ListItems == null)
            return String.Empty;


        var containerTag = new TagBuilder("td");
        containerTag.MergeAttribute("id", inputName + "_Container");                
        foreach (var item in radioButtonList.ListItems)
        
            var radioButtonTag = RadioButton(htmlHelper, inputName, new SelectListItemText=item.Text, Selected = item.Selected, Value = item.Value.ToString(), htmlAttributes);

            containerTag.InnerHtml += radioButtonTag;
        

        return containerTag.ToString();
    

    public static string RadioButton(this HtmlHelper htmlHelper, string name, SelectListItem listItem,
                         IDictionary<string, object> htmlAttributes)
    
        var inputIdSb = new StringBuilder();
        inputIdSb.Append(name);

        var sb = new StringBuilder();

        var builder = new TagBuilder("input");
        if (listItem.Selected) builder.MergeAttribute("checked", "checked");
        builder.MergeAttribute("type", "radio");
        builder.MergeAttribute("value", listItem.Value);
        builder.MergeAttribute("id", inputIdSb.ToString() + "_" + listItem.Text);    
        builder.MergeAttribute("name", name + "_value");
        builder.MergeAttributes(htmlAttributes);
        sb.Append(builder.ToString(TagRenderMode.SelfClosing));
        sb.Append(RadioButtonLabel(inputIdSb.ToString(), listItem.Text, htmlAttributes));
        return sb.ToString();
    

    public static string RadioButtonLabel(string inputId, string displayText,
                                 IDictionary<string, object> htmlAttributes)
    
        var labelBuilder = new TagBuilder("label");
        labelBuilder.MergeAttribute("for", inputId + "_" + displayText);
        labelBuilder.MergeAttributes(htmlAttributes);
        labelBuilder.InnerHtml = displayText;

        return labelBuilder.ToString(TagRenderMode.Normal);
    


    public static TProperty GetValue<TModel, TProperty>(HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class
    
        TModel model = htmlHelper.ViewData.Model;
        if (model == null)
        
            return default(TProperty);
        
        Func<TModel, TProperty> func = expression.Compile();
        return func(model);
    

【讨论】:

以上是关于有没有人为 ASP.NET MVC 实现 RadioButtonList For<T> ?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC,使用可点击项实现 MVC-Grid

如何在 ASP.Net MVC 中将登录视图实现为 jQueryUI 对话框

如何将 ASP.NET Identity 实现到一个空的 MVC 项目

asp.net mvc5 如何控制没有权限的页面不显示

asp.net MVC实现文章的上一篇下一篇

asp.net mvc框架优缺点