2013-09-02 28 views
5

JavaScriptからintの配列をint配列とintの2つのパラメータを受け入れるMVCコントローラに渡そうとしています。これは、コントローラアクションによって返されたビューへのページリダイレクトを実行することです。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として宣言し、パラメータを手動でシリアライズおよびデシリアライズすることはできますが、単純な型変換を自動的に行うためにフレームワークを取得する方法を理解する必要があります。

ありがとうございます!

答えて

9

MVCで単純な値の配列を渡すには、複数の値に同じ名前を付けるだけです。 URIが正しくint配列のアクションパラメータにこれを結合するMVCでこの結合

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

デフォルトモデルのようなものを探してしまいます。

複雑な値の配列であった場合、モデル結合には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は、複合型のコレクションをバインドするために使用するバインディング、私たち自身のインデクサーを指定しています。インデクサには、私が知っている限り、任意の文字列を使用できます。

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

+0

配列をループして各要素をクエリ文字列に追加して長い文字列を作成しなければならないという事実はありませんか? –

+0

jQueryを使用しているとタグ付けしました。したがって、 '$ .param' http://api.jquery.com/jQuery.param/を使用してエンコードされた値を作成することができます。 ( "ids:dataArray、currentId:dataArray [0]}))' $ "の値を返します。 –

関連する問題