3

昨夜、MVC2以来取り組んできたものをまとめようとしました。

次のクラスがあるとします。

public class RouteSaveViewModel
{
    public string Title { get; set; }
    public string Comments { get; set; }
    public string DepartureDate { get; set; }
    public string ArrivalDate { get; set; }
    public List<int> LocationIds { get; set; }
}

...そして以下のアクション:

    [HttpPost]
    public ViewResult SaveRoute(RouteSaveViewModel route)
    {
        // yada yada
        return SomethingShiny();
    }

$.ajaxまたは$.postを使用してデータを渡したいのですが。フォームは、ユーザーからデータを収集して送信するための多段階です。ロケーションIDを作成するために使用するコードは次のとおりです。

        var routeStopIds = [];
        $(".route-stop").each(function(){
            routeStopIds.push($(this).attr('data-id'));
        });

ブラウザ内の開発ツールとフィドラーを使用して、この配列に期待するIDが含まれていることを確認しました。最後に、データを送信するために、以前のMVCビルドで行ったようにオブジェクトをマッピングしています。

        $.ajax({
            type: 'post',
            url: postUrl,
            data: {
                Title: $("#route-title").val(),
                Comments: $("#route-description").val(),
                DepartureDate: depDate,
                ArrivalDate: arrDate,
                LocationIds: routeStopIds                    
            },
            dataType: 'JSON'
        });

私が見ているのは、パラメータを除くすべてのデータが入力されていることです。また、を受け入れるだけで、どちらも機能していないように見える変更に配列LocationIdsだけを送信しようとしました。いずれにせよ、はnullですが、リクエストのフォームパラメータにフォームエンコードされた値があります。routeStopIdsSaveRouteList<int>LocationIds

{LocationIds%5b%5d=44&LocationIds%5b%5d=4&LocationIds%5b%5d=2}

...それでも、HttpValueCollectionは単なるLocationIds[]空の配列です。

それで、私は明白な何かを逃していますか?多分それほど明白ではありませんか?モデルバインディングによって配列が取得されるようにするにはどうすればよいですか?

4

1 に答える 1

4

私がMVC2以来それが機能していたと言ったその部分を覚えていますか?ええ、それはここにありました: 高度なモデルバインディング その投稿で、私は明示的に次のことを述べました:

注:配列の結果をASP.NET MVCのバインディングメカニズムと互換性を持たせるには(MVC 2.0の場合と同様)、$。ajax()の「従来の」設定を使用する必要があります。

この設定を含めるようにajax呼び出しを変更することが修正されました。雨と柔らかい羊毛の子猫のようにすべてが正しいです。またはミトンか何か。

        $.ajax({
            type: 'post',
            url: postUrl,
            traditional: true, // <----- here be kittens
            data: {

                Title: $("#route-title").val(),
                Comments: $("#route-description").val(),
                DepartureDate: depDate,
                ArrivalDate: arrDate,
                LocationIds: routeStopIds 
            },
            dataType: 'JSON'
        });
于 2012-06-13T15:03:46.090 に答える