将模型传回控制器,复选框返回空白

时间:2013-07-10 22:45:06

标签: asp.net-mvc-4 razor

尝试掌握如何将以下数据作为模型传递给控制器​​。我想使用模型并在之后将所有内容添加到数据库中。当我将表单提交回控制器时,模型为空。是因为其他所有东西都是空的吗?我必须将其他所有内容作为隐藏字段传回去吗?在进入控制器之前,如何在View上对其进行排序?

我的控制器基本上将一个看起来像这样的xml文件反序列化回视图

<category>
    <id>1</id>
    <description>movies</description>
    <genre>
        <genres>
            <id>1</id>
            <name>comedy</name>
        </genres>
        <genres>
            <id>2</id>
            <name>action</name>
        </genres>
        <genres>
            <id>3</id>
            <name>adventure</name>
        </genres>
        <genres>
            <id>4</id>
            <name>drama</name>
        </genres>
        <genres>
            <id>5</id>
            <name>romance</name>
        </genres>
    </genres>
</category>

视图/表单看起来像这样

   <form>
   <ul>
   @for (int x = 0; x < Model.categories[i].genres.Count(); x++)
   {
      <li>
           <label for="@Model.categories[i].genres[x].name">
           <input type="checkbox" name="@Model.categories[i].genres[x].name" value="@Model.categories[i].genres[x].id" checked="@Model.categories[i].genres[x].selected" /> @Model.categories[i].genres[x].name
           </label>
      </li>
    }
    </ul>
    </form>

2 个答案:

答案 0 :(得分:1)

为所有复选框添加固定名称,例如GenreIds。

然后,在您的操作中,您应该收到string[] genreIds参数。

发布表单时,genreIds将作为am数组发布,因此必须在数组参数中接收。

如果这不起作用,因为您有许多类别并希望在其自己的类别中接收每组GenreIds,那么您可以发送表单值的JSON表示并在服务器端接收和反序列化它。为此:

在剃须刀模板上:

  1. 使用该类型的名称命名每个类别中的所有复选框
  2. 处理表单sumit事件,并且:

    1. 使用jQuery serializeArray将所有表单元素放入数组
    2. 然后使用JSON.stringify将此数组转换为JSON格式
    3. 最后将此字符串复制到具有固定名称的隐藏字段并发布表单。即在隐藏字段中,名称为“serializedFormValues”
    4. 在服务器端:

      1. 使用名称“serializedFormValues”向您的操作添加参数,并键入= string
      2. 获取此参数的值并反序列化收到的JSON字符串,并在服务器端使用它
      3. 如果您使用JSON.NET,则可以转换JSON to XMLto an anonymous type object。还有其他的可能性。

        请记住,在任何情况下,类型ID都将始终为string[](或int,如果是这种情况),此数组将仅包含选中的值。

        有一个最后的可能性是手动处理Request.Form“。但这更难做到。

答案 1 :(得分:0)

尝试使用CheckboxFor而不是输入标记。

对于您的代码,您没有与复选框关联的ID。你应该如何在你的控制器中收到它?