注意:这个问题已经超过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更新的。
但我的对象并不是为此而设置的;这意味着这是唯一的办法吗?还有别的办法吗?
与nautic20的答案相同,只是简单地使用MVC默认模型绑定复选框列表与ViewModel中string/int/enum的集合属性同名。就是这样。
但有一个问题需要指出。在每个复选框组件中,不应该在其中放入“Id”,这会影响MVC模型绑定。
下面的代码将用于模型绑定:
<% foreach (var item in Model.SampleObjectList)
{ %>
<tr>
<td><input type="checkbox" name="SelectedObjectIds" value="<%= item.Id%>" /></td>
<td><%= Html.Encode(item.Name)%></td>
</tr>
<% } %>
下面的代码将不会绑定到模型(这里的区别是为每个复选框分配id)
<% foreach (var item in Model.SampleObjectList)
{ %>
<tr>
<td><input type="checkbox" name="SelectedObjectIds" id="[some unique key]" value="<%= item.Id%>" /></td>
<td><%= Html.Encode(item.Name)%></td>
</tr>
<% } %>
与nautic20的答案相同,只是简单地使用MVC默认模型绑定复选框列表与ViewModel中string/int/enum的集合属性同名。就是这样。
但有一个问题需要指出。在每个复选框组件中,不应该在其中放入“Id”,这会影响MVC模型绑定。
下面的代码将用于模型绑定:
<% foreach (var item in Model.SampleObjectList)
{ %>
<tr>
<td><input type="checkbox" name="SelectedObjectIds" value="<%= item.Id%>" /></td>
<td><%= Html.Encode(item.Name)%></td>
</tr>
<% } %>
下面的代码将不会绑定到模型(这里的区别是为每个复选框分配id)
<% foreach (var item in Model.SampleObjectList)
{ %>
<tr>
<td><input type="checkbox" name="SelectedObjectIds" id="[some unique key]" value="<%= item.Id%>" /></td>
<td><%= Html.Encode(item.Name)%></td>
</tr>
<% } %>