3

私のモデルのほとんどはを使用して$('form').serializeArray()入力されますが、ページグリッドを形成するオブジェクトの配列はそのマネージャーから入力する必要があります。例えば:

public JsonResult SubmitForm(MyViewModel input)
{

..。

public class MyViewModel
{
  [Display(Name = "Name")]
  public string GridName { get; set; }

  [Display(Name = "Description")]
  public string GridDescription { get; set; }

  public GridRow[] GridRows { get; set; }

名前と説明はによって取得されserializeArray()ますが、問題はありません。GridRowがの場合、string[]jqueryが作成したシリアル化された配列に複数のインスタンスをプッシュするだけで受け入れられます。

var data = $('form').serializeArray();
for (var i in gridData) {
   data.push({ name: 'GridRows', value: gridData[i].id });
}
$.ajax({
   type: "POST",
   url: '/Central/Results/SubmitForm',
   dataType: "json",
   data: data,

このようにして、少なくともIDの配列を取得できます。gridData[i]ただし、適切なデータ型を設定する場合は、オブジェクト全体をオブジェクトにプッシュすることはできません( )。コントローラに到達すると、常にnull値を取得します。

MVCがモデルに正しくデータを入力するために、データをどのように処理する必要があるかについて何か考えはありますか?ありがとう。

4

2 に答える 2

1

これは、Ajaxの投稿でtraditionalオプションをに設定する必要があることに関連していると確信しています。truejQueryは、MVCコントローラーアクションにいつポストされるかという点で、予想とは少し異なる方法で配列を処理します。

だからこれを行う:

$.ajax({
   type: "POST",
   url: '/Central/Results/SubmitForm',
   dataType: "json",
   traditional: true,
   data: data,
   ...

詳細については、この回答を参照してください。

于 2012-11-14T17:23:02.520 に答える
0

行とプロパティ参照を追加し、各変数を個別に追加する必要があることがわかりました。

        for (var i in gridData) {
           for (var j in gridData[i]) {
              data.push({ name: 'GridRows[' + i + '].' + j, value: gridData[i][j] });
           }
        }

編集:私がこれのために少し前に書いた私の更新されたヘルパーメソッドを投稿すると思っただけです。

function serializeArray(obj, data, name) {
   /// <summary>Turns an object into an MVC standard array of values </summary>
   /// <param name="obj" type="Object">Object to serialise (required)</param>
   /// <param name="data" type="Array">Array to append data to end of (optional)</param>
   /// <param name="name" type="String">Name prefix for all entries (optional/ignore)</param>

   if (!data || !(data instanceof Array)) {
      data = [];
   }
   if (obj instanceof Array) {
      if (!name) {
         throw "Need an object name when converting an array";
      }
      for (var index = 0; index < obj.length; index++) {
         data = serializeArray(obj[index], data, name + '[' + index + ']');
      }
   } else if (obj instanceof Object) {
      for (var property in obj) {
         if (obj.hasOwnProperty(property)) {
            data = serializeArray(obj[property], data, name ? (name + '.' + property) : property);
         }
      }
   } else {
      data.push({ name: name, value: obj });
   }
   return data;
}
于 2012-11-15T10:48:24.950 に答える