将我的视图模型绑定到视图会导致检查所有复选框

时间:2015-06-15 21:37:39

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

我遇到了一个问题,即我在视图中呈现的所有复选框都会被检查出来。我在构建视图模型的行上放置了一个断点,通过调试器,我可以看到一些值被设置为" 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>
}

4 个答案:

答案 0 :(得分:3)

在我看来,问题就像你在 taskdet.sort((a, b) -> { int r = a.date - b.date; return r == 0 ? r : a.id - b.id; }); CheckBoxFor之后对输入进行了硬编码。

HtmlHelper

卸下:

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

还值得注意的是,当您使用<input type="checkbox" value="" checked="checked"/> 循环而不是foreach循环时,您将无法将所选值发布回服务器。

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

for

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

答案 1 :(得分:1)

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

还存在关于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>
}

答案 2 :(得分:1)

在您的视图中,删除

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

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

答案 3 :(得分:0)

试试这段代码...... 而不是:<input type="checkbox" value="" checked="checked"/> Allow Access

尝试: <input type="checkbox" value="" checked="@m.AccessGranted "/> Allow Access

此外,请勿使用m1参数..