问题

Caution: This question is over five years old!

您最好的选择是搜索更新的问题,或搜索下面的答案寻找您的特定版本的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)%>&nbsp;<%= 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列出其值为"真假",而不是只是真.

显然,我错过了一些东西.我认为这是建立在这样的想法,使用 UpdateModel()或通过ModelBinder更新集合中的对象在HTML表单中作用的对象.

但我的对象没有设置为此;这是否意味着这是唯一的方法?有另一种方法吗?



解决方法

Html.CheckBox正在做一些奇怪的事情 - 如果在结果页面上查看源代码,您会看到每个复选框旁边都会生成一个&lt; input type ="hidden"/&gt; 这说明了您为每个表单元素看到的"真假"值.

尝试这个,这绝对适用于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 ,每个复选框的 value 是相应对象的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 参数中,甚至将Request.Form集合中的字符串解析为实例化的GUID对象,我认为很好.




相关问题推荐