【问题标题】:How can I override the name attribute of a RadioButtonFor?如何覆盖 RadioButtonFor 的名称属性?
【发布时间】:2012-06-17 19:18:37
【问题描述】:

我正在尝试将使用 for 循环和 Razor 语法创建的单选按钮组合在一起。代码如下:

       @for (var i = 0; i < Model.Sessions.Count(); i++)
       {
            @Html.HiddenFor(it => it.Sessions[i].Id)
            @Html.RadioButtonFor(it => it.Sessions[i].Checkbox, "0", new {@class = "Sessions", @id = id, @name="Sessions"})
            @Html.LabelFor(it => it.Sessions[i].Name, Model.Sessions[i].Name)
            <span class="time-span"><em>@Model.Sessions[i].StartTime</em><em>@Model.Sessions[i].EndTime</em></span>
            <br />
       }

for 循环内的第三行是问题所在。基本上名称不会改变,它始终是“Sessions[x].Checkbox”。复选框是自定义类的属性(布尔值)。我似乎无法调试 Razor 的东西,所以任何帮助将不胜感激,我猜这对这里的人来说是非常明显的。

编辑 Dimitrov 的帖子很有帮助。下面是我使用的最终代码。我使用 @class 和 @id 属性能够使用 Javascript 来选择最初选择的会话(因为这是一个编辑,而不是创建表单)。

    @for (var i = 0; i < Model.Sessions.Count(); i++)
    {
        @Html.HiddenFor(it => it.Sessions[i].Id)
        var SId = @Model.Sessions[i].Id;
        @Html.RadioButtonFor(it => it.selectedSession, Model.Sessions[i].Id, new { id = SId, @class = "Sessions" })
        @Html.LabelFor(it => it.Sessions[i].Name, Model.Sessions[i].Name)
        <span class="time-span"><em>@Model.Sessions[i].StartTime</em><em>@Model.Sessions[i].EndTime</em></span>
        <br />
    }

【问题讨论】:

  • 为什么要改名?如果更改名称,MVC 将无法在提交表单时将字段绑定回模型。您的 htmlAttributes 参数中有两次 @name = "Sessions"。看起来您还试图在每个循环上将 id 属性设置为相同的值,从而导致 id 重复(与您的问题无关,但不是有效的 html,并且可能会破坏 id 的 DOM 查找)。
  • 所有单选按钮都有不同的名称(x 代表 1、2、3 等),因此它们没有组合在一起,因此我可以选择全部或不选择。
  • 哦,是的,那个副本是错误的,它是我代码中的@class,我在帖子中做了一个小的(不正确的)编辑。所以最重要的是,这不会导致任何错误。
  • 而且 ids 来自发送到视图中的模型,它不会重复(它存储在 Checkbox 实体中)

标签: html asp.net-mvc razor html-helper radiobuttonfor


【解决方案1】:

如果你希望能够只选择一个单选按钮,你需要在你的视图模型上有一个属性来保存选定的会话 id,如下所示:

public class SessionViewModel
{
    public int SelectedSessionId { get; set; }
    public IList<Session> Sessions { get; set; }
}

public class Session
{
    public int Id { get; set; }
    public string Name { get; set; }
}

然后有一个控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new SessionViewModel
        {
            SelectedSessionId = 2,
            Sessions = Enumerable.Range(1, 5).Select(x => new Session
            {
                Id = x,
                Name = "session" + x,
            }).ToList()
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(SessionViewModel model)
    {
        return Content("Thank you for selecting session id: " + model.SelectedSessionId);
    }
}

最后是一个视图:

@model SessionViewModel

@using (Html.BeginForm())
{
    for (var i = 0; i < Model.Sessions.Count(); i++)
    {
        @Html.HiddenFor(x => x.Sessions[i].Id)
        @Html.RadioButtonFor(x => x.SelectedSessionId, Model.Sessions[i].Id, new { id = "session_" + i })
        @Html.Label("session_" + i, Model.Sessions[i].Name)
        <br/>
    }
    <button type="submit">OK</button>
}

【讨论】:

  • 非常感谢,这有帮助。我拥有的 C# 代码实际上非常相似,而且我实际上有一个 SelectedSessionID,我想我打算用它来开头 :P ,但我不知道为什么,但我陷入了为整个班级制作编辑器的困境(CheckBoxModel),显然这没有意义。没有使用完全相同的代码,请参阅我帖子中的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2016-08-02
  • 2011-08-28
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
相关资源
最近更新 更多