注意:这个问题已经超过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更新的。
但我的对象并不是为此而设置的;这意味着这是唯一的办法吗?还有别的办法吗?
伟大的发现!!我非常感谢。为了进一步扩展,这种技术还可以与视图模型方法完美结合。MVC太酷了,它足够聪明,可以将一组guid绑定到与绑定到视图的Model对象同名的属性上。例子:
ViewModel:
public class SampleViewModel
{
public IList<SampleObject> SampleObjectList { get; set; }
public Guid[] SelectedObjectIds { get; set; }
public class SampleObject
{
public Guid Id { get; set; }
public string Name { get; set; }
}
}
观点:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Sample View</h2>
<table>
<thead>
<tr>
<th>Checked</th>
<th>Object Name</th>
</tr>
</thead>
<% using (Html.BeginForm()) %>
<%{%>
<tbody>
<% foreach (var item in Model.SampleObjectList)
{ %>
<tr>
<td><input type="checkbox" name="SelectedObjectIds" value="<%= item.Id%>" /></td>
<td><%= Html.Encode(item.Name)%></td>
</tr>
<% } %>
</tbody>
</table>
<input type="submit" value="Submit" />
<%}%>
控制器:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult SampleView(Guid id)
{
//Object to pass any input objects to the View Model Builder
BuilderIO viewModelBuilderInput = new BuilderIO();
//The View Model Builder is a conglomerate of repositories and methods used to Construct a View Model out of Business Objects
SampleViewModel viewModel = sampleViewModelBuilder.Build(viewModelBuilderInput);
return View("SampleView", viewModel);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SampleView(SampleViewModel viewModel)
{
// The array of Guids successfully bound to the SelectedObjectIds property of the View Model!
return View();
}
任何熟悉视图模型哲学的人都会感到高兴,这就像一个冠军!
我还想指出,您可以为每个复选框命名一个不同的名称,并将该名称作为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) {
...
}
视图中的值被传递给操作,因为名称是相同的。
我知道这个解决方案对您的项目不是理想的,但我想我要把这个想法说出来。
超文本标记语言CheckBox做了一些奇怪的事情——如果你在结果页面上查看源代码,你会看到每个复选框旁边都生成了一个<input type="hidden" />,这解释了你看到的每个表单元素的"true false"值。
试试这个,它肯定能在ASP上工作。NET MVC Beta版,因为我刚刚尝试过。
把它放在视图中,而不是使用Html.CheckBox():
<% using (Html.BeginForm("ShowData", "Home")) { %>
<% foreach (var o in ViewData.Model) { %>
<input type="checkbox" name="selectedObjects" value="<%=o.Id%>">
<%= o.Name %>
<%}%>
<input type="submit" value="Submit" />
<%}%>
您的复选框都被称为selectedObjects,每个复选框的值是对应对象的GUID。
然后发布到下面的控制器动作(或做一些有用的事情而不是Response.Write())
public ActionResult ShowData(Guid[] selectedObjects) {
foreach (Guid guid in selectedObjects) {
Response.Write(guid.ToString());
}
Response.End();
return (new EmptyResult());
}
这个例子只会写你选中的方块的guid;ASP。NET MVC将选中复选框的GUID值映射到GUID [] selectedObjects参数中,甚至解析来自请求的字符串。将集合形成实例化的GUID对象,我认为这是相当不错的。