加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 使用HtmlHelper类时,MVC单选按钮列表未分组

发布时间:2020-12-16 00:15:17 所属栏目:asp.Net 来源:网络整理
导读:难以创建组合在一起的单选按钮列表,特别是在MVC 3中,但这也适用于MVC 2. 当使用Html助手生成单选按钮并且模型是数组的一部分时,会出现问题. 这是我的代码的缩减版本. public class CollectionOfStuff { public MVCModel[] Things { get; set }}/*This model
难以创建组合在一起的单选按钮列表,特别是在MVC 3中,但这也适用于MVC 2.

当使用Html助手生成单选按钮并且模型是数组的一部分时,会出现问题.

这是我的代码的缩减版本.

public class CollectionOfStuff {
  public MVCModel[] Things { get; set }
}

/*This model is larger and represents a Person*/    
public class MVCModel {

  [UIHint("Hidden")]
  public string Id { get; set; }

  public string Name { get; set; }

  public bool IsSelected { get; set; }
}

/*Assigned to new CollectionOfStuff property Things*/    
var items = new[] { 
 new MVCModel() { Id="0" Name = "Name here" },new MVCModel() { Id="1" Name = "Name there" } 
}

我的父母观点

@model CollectionOfStuff

@for (int i = 0; i < Model.Things.Length; i++) {
    @Html.EditorFor(m => m.Things[i]);
}

我的视图渲染单个MVCModel对象

@Model MVCModel

    @{
      var attr = new {
        Checked = Model.IsSelected ? "checked=checked" : ""
      };
    }

    @Html.RadioButtonFor(model => model,Model.Id,attr)

生成此输出:

<input type="radio" value="0" name="MVCModel[0]" id="MVCModel_0_" data-val-required="You need to choose" data-val="true" />
<input type="radio" value="1" name="MVCModel[1]" id="MVCModel_1_" data-val-required="You need to choose" data-val="true" />

单选按钮没有分组,但它具有写出元数据以进行验证的明显优势.

另一种方式是通过调用:

@Html.RadioButton(name: "GroupName",value: Model.Id,isChecked: Model.IsSelected)

生产:

<input type="radio" value="0" name="MVCModel[0].GroupName" id="MVCModel_0__GroupName">
<input type="radio" value="1" name="MVCModel[1].GroupName" id="MVCModel_1__GroupName">

同样,这不会产生所需的结果.它也缺少验证元数据.

另一个选择是创建自定义模板,但此方法的问题是验证所需的所有元数据都不存在.

关于如何创建分组单选按钮或获取元数据的任何想法,以便我自己创建模板?

解决方法

您尚未显示视图模型的外观,但您可以按某些属性对它们进行分组.让我们举一个例子:
public class MyViewModel
{
    [Required]
    public string SomeProperty { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

视图:

@model AppName.Models.MyViewModel
@using (Html.BeginForm())
{
    <div>A: @Html.RadioButtonFor(x => x.SomeProperty,"a")</div>
    <div>B: @Html.RadioButtonFor(x => x.SomeProperty,"b")</div>
    @Html.ValidationMessageFor(x => x.SomeProperty)
    <input type="submit" value="OK" />
}

现在,如果你想预先选择一些无线电,只需将视图模型的属性设置为无线电的相应值,而不是在视图中编写一些丑陋的C#代码:

public ActionResult Index()
{
    var model = new MyViewModel
    {
        SomeProperty = "a" // select the first radio
    };
    return View(model);
}

显然,这种技术适用于任何简单的属性类型(不仅仅是字符串)以及可以与此属性关联的任意数量的单选按钮.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读