1

私はasp.netmvc3を使用しており、渡すモデルを強く型付けしています。データが適切な形式である場合、モデルはデータを受け入れます。この形式は、データがでNameMatchingModel=value区切られていることを示します&。たとえば、私が持っていた場合:

ビューモデル:

public class CarViewModel
{
 public Car Car { get; set; }
}

public class Car
{
 public string Make { get; set; }
 public string Model { get; set; }
}

そして、このViewModelを受け入れるメソッドがありました

public ActionResult AcceptCarVM( CarViewModel model )
{
 //TODO: use car data
 return View();
}

ここで、車の詳細が入力されたビューモデルを渡します。この手動の方法よりもこれを行うためのより良いアプローチはありますか?

var carMake = "Ford";
var carModel = "Pinto";
var viewModelData = "Car.Make=" + carMake + "&Car.Model=" + carModel;
var encodeData = encodeURIComponent(viewModelData);
$.ajax({
            url: "@(Url.Action("AcceptCarVM"))",
            type: 'GET',
            data: encodeData,
            success: function (result) {
                //TODO: use result
        }
});
4

1 に答える 1

2

jQueryにはクエリ文字列をシリアライズする機能があります

$.param

ここにドキュメントがあります

もちろん、別の方法でデータを提供します...しかし、型をネストしているので、構造に関係なく JSON オブジェクトを正しくシリアル化し、Asp の方法で日付を変換する.toDictionaryプラグインを使用することをお勧めします。 .net MVC は、データ バインディングのタイミングを認識します。

var data = {
    Car: {
        Make: "Ford",
        Model: "Pinto"
    }
};

$.ajax({
    url: "@(Url.Action("AcceptCarVM"))",
    type: 'GET',
    data: $.toDictionary(data),
    success: function(result) {
        // TODO: use result
    }
});

あるいは:

var data = {
    Make: "Ford",
    Model: "Pinto"
};

$.ajax({
    url: "@(Url.Action("AcceptCarVM"))",
    type: 'GET',
    data: $.toDictionary(data, "Car"), // will provide root object's name
    success: function(result) {
        // TODO: use result
    }
});

2 つ目は、同じタイプの 2 つのパラメーターを受け取るコントローラー アクションがある場合に特に便利です。そのため、アクション パラメーター名と同じルート オブジェクトの名前を指定できるため、サーバー側で正しくデータ バインドされます。つまり、次のようになります。

public ActionResult AcceptCarVM(CarViewModel carOne, CarViewModel carTwo) { ... }

プラグインは内部で jQuery 機能を使用するため、物事を確実にシリアル化し、特に Asp.net MVC バックエンドに適しています。

于 2012-09-03T23:28:58.787 に答える