ASP.NET MVC:使用Html.CheckBoxFor()在选中时收集字符串值列表

时间:2012-10-08 19:40:16

标签: asp.net asp.net-mvc checkbox model-binding

在我的网络应用程序中,我有一个页面,其中包含管理员批量批准或拒绝的“请求”列表。所以页面看起来像:

[x] Request 1
[ ] Request 2
[x] Request 3
[ ] Request 4

[Approve Selected]   [Deny Selected]

我的模型看起来像:

public class RequestManagementModel
{
    public List<string> LicenseIdsToProcess { get; set; }
    public List<Resource> Resources { get; set; }
    // additional fields
}

在我看来,我有:

int counter = 0;
@foreach (Resource r in Model.Resources)
{
    <tr>
        <td>
            @Html.CheckBoxFor(model => model.LicenseIdsToProcess[counter++], new { value = r.RequestId })
        </td>
    </tr>
}

当然我的控制器动作接受表单上的模型

public ActionResult ProcessRequests(RequestManagementModel model, ProcessType type)
{
    // process requests here
}

所以,正如您所料,我在model.LicenseIdsToProcess[counter++]的视图中收到一条错误,指出“无法将类型'字符串'隐式转换为'bool'”。它不喜欢这样的事实:我试图使用复选框来表示用户可以从中选择一个或多个的值列表,而不是单个true / false。

我希望这样设置,以便对于用户选择的每个复选框,该字符串id值在发布表单时绑定到模型中的id列表。我知道如何使用<input type="checkbox">来完成它,因为我可以在那里设置复选框的值。但有没有办法使用它与Html.CheckBoxFor通过模型绑定实现强类型?

感谢。

1 个答案:

答案 0 :(得分:4)

您的清单必须是:

public class RequestManagementModel
{
    public Dictionary<string, bool> LicenseIdsToProcess { get; set; }
    public List<Resource> Resources { get; set; }
    // additional fields
}

由于LicenseIdsToProcess当前是List<string> Html.CheckBoxFor()无法将字符串值转换为bool值。你需要使用类似字典或列表的东西,例如

public class Licence
{
    public string Id { get; set; }
    public bool Processed { get;set; }
}

public class RequestManagementModel
{
    public List<Licence> LicenseIdsToProcess { get; set; }
    public List<Resource> Resources { get; set; }
    // additional fields
}

int counter = 0;
@foreach (Resource r in Model.Resources)
{
    <tr>
        <td>
            @Html.CheckBoxFor(model => model.License[counter++].Processed, new { value = r.RequestId })
        </td>
    </tr>
}

或类似的东西:)

编辑:

在回复评论时,我发现我的代码不正确。这是更新版本:

@for(int idx = 0; idx < Model.Resources.Count; idx++)
{
    <tr>
        <td>
            @Html.CheckBoxFor(model => model.License[idx].Processed, new { value = Model.Resources[idx].RequestId })
        </td>
    </tr>
}