单选按钮而不是 mvc 3 应用程序中的下拉列表?

Posted

技术标签:

【中文标题】单选按钮而不是 mvc 3 应用程序中的下拉列表?【英文标题】:Radiobuttons instead of dropdownlist in mvc 3 application? 【发布时间】:2011-07-23 02:05:23 【问题描述】:

我有一个视图,其中模型有一组项目。然后我有一个 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 中可能吗?如果有,怎么做?

【问题讨论】:

【参考方案1】:

这将是自定义 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" />

【讨论】:

我修改了上面的 RadioButtonFor() 方法以允许预先选择一个单选按钮项目(这只是设置选中属性的问题): sb.Append(htmlHelper.RadioButtonFor(ex, item.值, (item.Selected ? new Checked = "" : null)));【参考方案2】:
@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)

【讨论】:

但是有了这个,如何设置当前选中的Level呢? (就像我对下拉列表所做的那样) 如果 Level 是 int ,它将使用 RadioButtonFor 自动选择

以上是关于单选按钮而不是 mvc 3 应用程序中的下拉列表?的主要内容,如果未能解决你的问题,请参考以下文章

在付款方式中选择选项而不是 magento 中的单选按钮

选择单选按钮后的下拉列表

如何在 ReactJS 中更改单选按钮时重置选定的下拉列表

如何将枚举传递给 Html.RadioButtonFor 以获取 MVC 2 RC 2、C# 中的单选按钮列表

如何在下拉列表中显示名称而不是 ID 以供用户选择 MVC

如何使下拉列表和单选按钮只读? [复制]