0

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

我的控制器基本上将一个看起来像这样的 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>
4

2 回答 2

1

为所有复选框指定一个固定名称,例如 GenreIds。

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

发布表单时,genreIds 以 am 数组的形式发布,因此必须在数组参数中接收。

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

在剃刀模板上:

  1. 使用流派的名称来命名每个类别中的所有复选框

处理表单 sumit 事件,并且:

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

在服务器端:

  1. 为您的操作添加一个名为“serializedFormValues”的参数,然后键入 = string
  2. 获取该参数的值并反序列化接收到的JSON字符串,在服务端使用

如果您使用 JSON.NET,您可以将JSON 转换为 XML,或匿名类型对象。还有另一种可能性。

请记住,在任何情况下,流派 ID 将始终为string[](或者int,如果是这种情况),并且此数组将仅包含检查的值。

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

于 2013-07-10T23:56:46.680 回答
0

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

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

于 2013-07-10T23:01:17.447 回答