14

我有一个 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存储有关选中哪些复选框的信息?

4

2 回答 2

11

好的,这将适用于 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 助手(所有的CheckBoxFor,LabelForEditorFor)允许将数据绑定到模型属性。

现在请注意,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.
}
于 2012-05-18T09:05:25.133 回答
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
}

然后 IList 中的这些选项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)

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

于 2012-05-18T09:13:15.370 回答