0

次のデータをモデルとしてコントローラーに返す方法を把握しようとしています。モデルを使用して、後ですべてをデータベースに追加したいと考えています。フォームをコントローラーに送信すると、モデルは空です。他のすべてがnullだからですか?他のすべてを隠しフィールドとして戻す必要がありますか? コントローラーに到達する前に、ビューですべてを整理するにはどうすればよいですか?

私のコントローラーは基本的に、このような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は配列として投稿されるため、配列パラメータで受け取る必要があります。

多くのカテゴリがあり、GenreIds の各グループを独自のカテゴリで受信したいためにこれが機能しない場合は、フォーム値の JSON 表現を送信し、サーバー側で受信して逆シリアル化できます。そうするために:

かみそりのテンプレートで:

  1. ジャンルの名前を使用して、各カテゴリのすべてのチェックボックスに名前を付けます

フォーム サミット イベントを処理し、次のことを行います。

  1. jQuery serializeArrayを使用して、すべてのフォーム要素を配列に入れます
  2. 次に、JSON.stringifyを使用して、この配列を JSON 形式に変換します
  3. 最後に、この文字列を固定名の非表示フィールドにコピーして、フォームを投稿します。つまり、「serializedFormValues」という名前の非表示フィールドにあります。

サーバー側:

  1. 「serializedFormValues」という名前のパラメーターをアクションに追加し、type = string
  2. このパラメータの値を取得し、受け取った JSON 文字列を逆シリアル化し、サーバー側で使用します

JSON.NET を使用すると、JSON を XMLまたは匿名型オブジェクトに変換できます。別の可能性があります。

いずれにせよ、ジャンル ID は常にstring[](またはintti の場合は ) であり、この配列にはチェックされた値のみが含まれることに注意してください。

Request.Form「手動で」処理している最後の可能性があります。しかし、これを行うのは難しいです。

于 2013-07-10T23:56:46.680 に答える
0

input タグの代わりに CheckboxFor を使用してみてください。

コードに関しては、チェックボックスに関連付けられた ID がありません。コントローラーでそれをどのように受け取ることになっていますか?

于 2013-07-10T23:01:17.447 に答える