注意:这个问题已经超过9年了!
您最好的选择是搜索更新的问题,或者搜索下面的答案,寻找您特定的MVC版本,因为这里的许多答案现在已经过时了。
如果你确实找到了适合你的版本的答案,请确保答案包含了你正在使用的MVC版本。
(原来的问题从下面开始)
这对我来说似乎有点奇怪,但据我所知,这就是你怎么做的。
我有一个对象集合,我希望用户从中选择一个或多个对象。这对我来说是“带复选框的表单”。我的对象没有任何“选定”的概念(它们是通过反序列化wcf调用形成的基本POCO)。所以,我这样做:
public class SampleObject{
public Guid Id {get;set;}
public string Name {get;set;}
}
在视图中:
<%
using (Html.BeginForm())
{
%>
<%foreach (var o in ViewData.Model) {%>
<%=Html.CheckBox(o.Id)%> <%= o.Name %>
<%}%>
<input type="submit" value="Submit" />
<%}%>
并且,在控制器中,这是我能看到的唯一方法来找出用户检查了什么对象:
public ActionResult ThisLooksWeird(FormCollection result)
{
var winnars = from x in result.AllKeys
where result[x] != "false"
select x;
// yadda
}
首先,它很怪异,其次,对于用户选中的那些项,FormCollection将其值列出为“true false”而不仅仅是true。
显然,我遗漏了一些东西。我认为这是基于这样的想法构建的,即在html表单中所作用的集合中的对象是使用UpdateModel()或通过ModelBinder更新的。
但我的对象并不是为此而设置的;这意味着这是唯一的办法吗?还有别的办法吗?
我还想指出,您可以为每个复选框命名一个不同的名称,并将该名称作为actionresults参数的一部分。
的例子,
观点:
<%= Html.CheckBox("Rs232CheckBox", false, new { @id = "rs232" })%>RS-232
<%= Html.CheckBox("Rs422CheckBox", false, new { @id = "rs422" })%>RS-422
控制器:
public ActionResults MyAction(bool Rs232CheckBox, bool Rs422CheckBox) {
...
}
视图中的值被传递给操作,因为名称是相同的。
我知道这个解决方案对您的项目不是理想的,但我想我要把这个想法说出来。
我知道这个问题是在MVC3还没有出来的时候写的,但是对于任何遇到这个问题并且正在使用MVC3的人来说,您可能想要“正确”的方法来做这件事。
而我认为整个
Contains("true");
事情是伟大的和干净的,并适用于所有MVC版本,问题是,它没有考虑文化(如果它真的很重要的情况下bool)。
至少在MVC3中,计算bool值的“正确”方法是使用ValueProvider。
var value = (bool)ValueProvider.GetValue("key").ConvertTo(typeof(bool));
当我编辑权限时,我在客户的一个网站上这样做:
var allPermissionsBase = Request.Params.AllKeys.Where(x => x.Contains("permission_")).ToList();
var allPermissions = new List<KeyValuePair<int, bool>>();
foreach (var key in allPermissionsBase)
{
// Try to parse the key as int
int keyAsInt;
int.TryParse(key.Replace("permission_", ""), out keyAsInt);
// Try to get the value as bool
var value = (bool)ValueProvider.GetValue(key).ConvertTo(typeof(bool));
}
现在,它的美妙之处在于,你可以将它用于任何简单的类型,甚至根据文化(想想钱,小数等)它都是正确的。
ValueProvider是当你像这样形成action时使用的:
public ActionResult UpdatePermissions(bool permission_1, bool permission_2)
但是当您尝试动态地构建这些列表并检查值时,您永远不会在编译时知道Id,因此您必须动态地处理它们。