【问题标题】:Binding my view model to a view causes all check boxes to be checked将我的视图模型绑定到视图会导致选中所有复选框
【发布时间】:2015-06-15 21:37:39
【问题描述】:

我遇到了一个问题,我在视图中呈现的所有复选框都被选中。我在构建视图模型的行放置了一个断点,通过调试器,我可以看到一些值设置为“true”,而其他值设置为“false”。所以问题,我假设,必须在视图本身。

这是我的模型:

public class UserModulesAdministrationViewModel
{
    public bool AccessGranted { get; set; }
    public int ModuleId { get; set; }
    public string ModuleName { get; set; }
    public string ModuleDescription { get; set; }
}

这是呈现列表的控制器:

public ActionResult UserModules(int id)
{
   // Database stuff here

    var model = modules.Select(module => new Infrastructure.ViewModels.UserModulesAdministrationViewModel
    {
        ModuleId = module.AccessModuleId,
        AccessGranted = userModules.Any(z => z.AccessModuleId == module.AccessModuleId),
        ModuleName = module.ModuleName,
        ModuleDescription = module.ModuleDescription
    }).ToList();

    return View(model);
}

最后是我的相关视图代码:

@model IEnumerable<UserModulesAdministrationViewModel>

@foreach (UserModulesAdministrationViewModel m in Model)
{
    <div class="col-md-4" style="margin-top: 15px;">
    <div class="moduleBlockLong" style="position: relative">
        <div class="moduleHeader">@m.ModuleName</div>
        <div class="moduleText">@m.ModuleDescription</div>

        <div class="checkbox" style="position: absolute; bottom: 0; right: 80px">
            <label>

                @{
                    var m1 = m;
                }
                @Html.CheckBoxFor(z => m1.AccessGranted )
                <input type="checkbox" value="" checked="checked"/> Allow Access
            </label>
        </div>

    </div>
    </div>
}

【问题讨论】:

  • 只是确保,这是两个单独的复选框,您说的是前者,而不是后者? @Html.CheckBoxFor(z =&gt; m1.AccessGranted ) &lt;input type="checkbox" value="" checked="checked"/&gt;
  • @AmmarCSE - 我是个白痴。我忘了删除&lt;input type="checkbox"&gt; 行。呃。做出回答,我会接受的。
  • 嘿,你不是曾经因为代码中的逗号错位而花费数小时解决错误的人!我们都去过那里! :) 但是,嘿,如果任何问题仍然存在,请告诉我,以便我尝试提供帮助

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

在我看来,问题就像您在 CheckBoxFor HtmlHelper 之后对输入进行了硬编码。

@Html.CheckBoxFor(z => m1.AccessGranted )
<input type="checkbox" value="" checked="checked"/>

删除:

<input type="checkbox" value="" checked="checked"/>

还值得注意的是,当您使用foreach 循环而不是for 循环时,您将无法将选定的值发布回服务器。

您需要按如下方式索引您的循环:

@for (var i = 0; i < Model.Count; i++)
{
  // code
  @Html.CheckBoxFor(z => Model[i].AccessGranted)
  // rest of code
}

否则您将无法读取服务器上的任何用户输入。

【讨论】:

  • 感谢您的提示。我只是好奇,这是为什么呢? MVC 是否需要索引才能在集合中写入数据?
  • @Icemanind 当然没问题。由于它是一个集合,模型绑定器需要知道它在集合中的哪个项目,并将名称与计数一起呈现在客户端上。这是一篇很棒的文章haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx :)
【解决方案2】:

在您看来,删除

 <input type="checkbox" value="" checked="checked"/> Allow Access

由于checked="checked",这将始终打印出一个选中复选框。

【讨论】:

    【解决方案3】:

    我认为这是因为你离开了&lt;input type="checkbox" value="" checked="checked"/&gt; 删除它,它会工作。

    还有一个关于foreach循环的问题。

    ASP.NET MVC 4 - for loop posts model collection properties but foreach does not

    解决方案:

    @for(var i = 0; i<Model.Count; i++)
    {
        <div class="col-md-4" style="margin-top: 15px;">
          <div class="moduleBlockLong" style="position: relative">
            <div class="moduleHeader">@Model[i].ModuleName</div>
            <div class="moduleText">@Model[i].ModuleDescription</div>
            <div class="checkbox" style="position: absolute; bottom: 0; right: 80px">
                <label>    
                     @Html.CheckBoxFor(z => Model[i].AccessGranted) Allow Access 
                </label>
            </div>    
          </div>
        </div>
    }
    

    【讨论】:

      【解决方案4】:

      试试这个代码... 而不是:&lt;input type="checkbox" value="" checked="checked"/&gt; Allow Access

      尝试: &lt;input type="checkbox" value="" checked="@m.AccessGranted "/&gt; Allow Access

      另外,不要使用m1参数..

      【讨论】:

      • 我不确定这个答案是什么意思。更改文本不会对程序逻辑产生任何影响,除了您建议的更改与原始文本相同。
      • 进一步检查,这里有答案,但代码的格式不适合正确阅读。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      相关资源
      最近更新 更多