我有一个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
存储有关哪些复选框的信息检查?
答案 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帮助程序(所有CheckBoxFor
,LabelFor
,EditorFor
等)允许将数据绑定到模型属性。
现在请注意,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)
这是全功能的,它允许您在验证错误发生时重新显示视图等。这看起来有点复杂,但我还没有找到比这更好的解决方案。