5

JavaScript から int 配列と int の 2 つのパラメーターを受け入れる MVC コントローラーに int の配列を渡そうとしています。これは、コントローラー アクションによって返されたビューへのページ リダイレクトを実行するためです。

var dataArray = getAllIds(); //passes back a JavaScript array 
window.location.replace("/" + controllerName + "/EditAll?ids=" + dataArray + "&currentID=" + dataArray[0])

サンプルの使用法では、dataArray には 1,7 が含まれています。

コントローラーコード

public virtual ActionResult EditAll(int[] ids, int currentID)
{

  currentModel = GetID(currentID);
  currentVM = Activator.CreateInstance<ViewModel>();
  currentVM.DB = DB;
  currentVM.Model = currentModel;
  currentVM.ViewMode = ViewMode.EditAll;
  currentVM.ModelIDs = ids;

  if (currentModel == null)
  {
      return HttpNotFound();
  }

  return View("Edit", MasterName, currentVM);
}

問題は、コントローラーに渡された int[] ID を調べると、その値が null になることです。currentID は期待どおり 1 に設定されます。

jQuery.ajaxSettings.traditional = true を設定しようとしましたが、効果はありません。また、JavaScript で @Url.Action を使用してサーバー側の URL を作成しようとしました。配列を渡す前に JSON.Stringify も試しました。

window.location.replace("/" + controllerName + "/EditAll?ids=" + JSON.stringify(dataArray) + "&currentID=" + dataArray[0])

ここでも、id 配列はコントローラー側で null になります。

int 配列をコントローラーに正しく渡すためのポインターはありますか? コントローラー アクションでパラメーターを String として宣言し、パラメーターを手動でシリアル化および逆シリアル化することもできますが、単純な型変換を自動的に行うようにフレームワークを取得する方法を理解する必要があります。

ありがとう!

4

1 に答える 1

12

MVC で単純な値の配列を渡すには、複数の値に同じ名前を付ける必要があります。たとえば、URI は次のようになります。

/{controllerName}/EditAll?ids=1&ids=2&ids=3&ids=4&ids=5&currentId=1

MVC のデフォルトのモデル バインディングは、これを int 配列の Action パラメータに正しくバインドします。

ここで、複雑な値の配列である場合、モデル バインディングには 2 つの方法があります。あなたがそのようなタイプを持っているとしましょう

public class ComplexModel
{
    public string Key { get; set; }

    public string Value { get; set; }
}

のコントローラ アクション シグネチャ

public virtual ActionResult EditAll(IEnumerable<ComplexModel> models)
{
}

モデルを正しくバインドするには、値にリクエストにインデクサーを含める必要があります。

/{controllerName}/EditAll?models[0].Key=key1&models[0].Value=value1&models[1].Key=key2&models[1].Value=value2

ここではインデクサーを使用してintいますが、UI でユーザーに表示されるアイテムをコレクション内の任意のインデックス/スロットで追加および削除できるアプリケーションでは、これは非常に柔軟性に欠けることが想像できます。この目的のために、MVC では、コレクション内の各項目に対して独自のインデクサーを指定し、その値を使用する既定のモデル バインディングの要求と共に渡すこともできます。

/{controllerName}/EditAll?models.Index=myOwnIndex&models[myOwnIndex].Key=key1&models[myOwnIndex].Value=value1&models.Index=anotherIndex&models[anotherIndex].Key=key2&models[anotherIndex].Value=value2

ここでは、独自のインデクサーを指定myOwnIndexanotherIndex、モデル バインディングで使用して複合型のコレクションをバインドします。私の知る限り、インデクサーには任意の文字列を使用できます。

または、独自のモデル バインダーを実装して、着信要求をモデルにバインドする方法を指示することもできます。これには、既定のフレームワーク規則を使用するよりも多くの作業が必要ですが、柔軟性がさらに向上します。

于 2013-09-02T14:28:44.177 に答える