如何将复选框映射到MVC模型成员?

时间:2012-05-18 08:47:15

标签: c# .net asp.net-mvc iis model

我有一个MVC视图

<%@ Page Language="C#" MasterPageFile="PathToMaster" Inherits="System.Web.Mvc.ViewPage<ModelData>" %>

我有一个带有HTML标记的表单,用于一组复选框:

<label for="MyCheckbox">Your choice</label>
<input type="checkbox" id="Option1" class="checkbox" name="MyCheckbox" value="Option one" />
<label for="Option1">Option one</label><br />
<input type="checkbox" id="Option2" class="checkbox" name="MyCheckbox" value="Option two" />
<label for="Option2">Option two</label><br />

我有一个控制器动作对

class MyController : Controller {
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult RequestStuff( ModelData data )
    {
    }
}

并在提交表单时调用该操作。

如何将复选框映射到ModelData的成员(以及我必须添加到ModelData的成员),以便在提交表单时data存储有关哪些复选框的信息检查?

2 个答案:

答案 0 :(得分:10)

好的,这个将用于MVC3,但是 - 除了语法更改 - 也应该在MVC2中工作。方法基本相同。

首先,您应该准备一个合适的(视图)模型

public class MyViewModel
{
    [DisplayName("Option 1")]
    public bool Option1 { get; set; }

    [DisplayName("Option 2")]
    public bool Option2 { get; set; }
}

然后将此模型传递给您正在显示的视图(控制器):

public ActionResult EditMyForm()
{
    var viewModel = new MyViewModel()
    return View(viewModel);
}

表格:

@model MyViewModel
@using( Html.BeginForm())
{
    @Html.Label("Your choice")

    @Html.LabelFor(model => model.Option1) // here the 'LabelFor' will show you the name you set with DisplayName attribute
    @Html.CheckBoxFor(model => model.Option1)

    @Html.LabelFor(model => model.Option2)
    @Html.CheckBoxFor(model => model.Option2)
    <p>
        <input type="submit" value="Submit"/>
    </p>
}

现在,HTML帮助程序(所有CheckBoxForLabelForEditorFor等)允许将数据绑定到模型属性。

现在请注意,EditorFor当属性类型为bool时,也会在视图中为您提供复选框。 :)

然后,当您提交给控制器时,它将自动绑定值:

[HttpPost]
public ActionResult EditMyForm(MyViewModel viewModel)
{
    //And here the view model's items will be set to true/false, depending what you checked.
}

答案 1 :(得分:3)

首先为选项定义SelectList。这将仅用于渲染复选框

    public IList<SelectListItem> OptionsSelectList { get; set; }

然后,您定义的模型将在发布后保留单个所选选项的值

public class ChooseOptionViewModel
{
    public int OptionIdentifier { get; set; } //name or id
    public bool HasBeenChosen { get; set; } //this is mapped to checkbox
}

然后在ModelData

中列出这些选项
public IList<ChooseOptionViewModel> Options { get; set; }

最后,视图

    @for (int i = 0; i < Model.OptionsSelectList.Count(); i++)
    {
        <tr>
            <td class="hidden">
                @Html.Hidden("Options[" + i + "].OptionIdentifier", Model.OptionsSelectList[i].Value)
            </td>
            <td>
                @Model.OptionsSelectList[i].Text
            </td>
            <td>
                @Html.CheckBox("Options[" + i + "].HasBeenChosen", Model.Options != null && Model.Options.Any(x => x.OptionIdentifier.ToString().Equals(Model.OptionsSelectList[i].Value) && x.HasBeenChosen))
            </td>
        </tr>
    }

发帖后,您只需检查Options.Where(x => x.HasBeenChosen)

这是全功能的,它允许您在验证错误发生时重新显示视图等。这看起来有点复杂,但我还没有找到比这更好的解决方案。