0

基本的にバウンディングボックスの配列(と呼ばれるbounds)であるJavaScript変数があります。各配列要素は次の形式です。

{
    XHigh: -71.00742992911023,
    XLow: -71.00670274612378,
    YHigh: 42.09467040703646,
    YLow: 42.09458047487587
}

そして、POST経由でアクションメソッドに送信しようとしています:

$.ajax({
    url: '/Map/GetLocations',
    type: 'POST',
    data: { boxes: bounds },
    success: function(data) {
        // doing something with the result
    }
});

サーバーでは、データを次のようにアクション メソッドに取り込みます。

[HttpPost]
public ActionResult GetLocations(IList<BoundingBox> boxes)
{
    // do something with boxes and return some json
}

DTO クラスは次のように定義されています。

public class BoundingBox
{
    public decimal XHigh { get; set; }
    public decimal XLow { get; set; }
    public decimal YHigh { get; set; }
    public decimal YLow { get; set; }
}

アクション メソッド内のboxes値には、POST で送信した正しい数の要素が含まれています。ただし、10 進数値はすべて 0 ですdouble。DTO でそれらを s に変更しようとしましたが、まだ 0.0 です。それらをstrings に変更しようとしましたが、それらは空でした。

これらの値を入力する方法について、モデル バインディングで何か不足していますか? このオブジェクトの配列をアクション メソッドに送信するにはどうすればよいですか?

4

2 に答える 2

1

私はあなたの問題のいくつかのバリエーションにも行き詰ったので、この問題のための小さなヘルパーを書きました. これらの問題を回避するには、JS オブジェクトのシリアル化されたバージョンをサーバーに送信し ( を使用JSON.stringify())、MVC でオンザフライで逆シリアル化します。

私が最初に書いたクラスはJsonParameterAttribute. TypedJsonBinder装飾されたパラメーターをバインドするときにmy を使用するように MVC に指示します。

public class JsonParameterAttribute : CustomModelBinderAttribute
{
    public override IModelBinder GetBinder()
    {
        return new TypedJsonBinder();
    }
}

私の場合、装飾されたパラメーターの値を文字列として受け取り、 Json.NETライブラリTypedJsonBinderを使用してパラメーターの型に逆シリアル化しようとします。(もちろん、他の逆シリアル化テクノロジを使用することもできます。)

public class TypedJsonBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        try
        {
            var json = (string) bindingContext.ValueProvider.GetValue(bindingContext.ModelName).ConvertTo(typeof (string));

            return JsonConvert.DeserializeObject(json, bindingContext.ModelType);
        }
        catch
        {
            return null;
        }
    }
}

JsonParameterAttributeその後、次のように使用できます。

public ActionResult GetLocations([JsonParameter] List<BoundingBox> boxes)
{
    // ...
}

そして、シリアル化することを忘れないでください:

$.ajax({
    url: '/Map/GetLocations',
    type: 'POST',
    data: { boxes: JSON.stringify(bounds) },
    success: function(data) {
        // doing something with the result
    }
});
于 2012-10-12T11:41:39.520 に答える
0

あなたのJsonがあなたが示したとおりにフォーマットされている場合、代わりに次の形式にする必要があると思います:

{ 
    XHigh: -71.00742992911023, 
    XLow: -71.00670274612378, 
    YHigh: 42.09467040703646, 
    YLow: 42.09458047487587 
} 

Json のデシリアライゼーションは、=キャラクターを窒息させます。

編集

変えたら

[HttpPost] 
public ActionResult GetLocations(IList<BoundingBox> boxes) 
{ 
    // do something with boxes and return some json 
} 

[HttpPost] 
public ActionResult GetLocations(BoundingBoxRequest request) 
{ 
    // do something with boxes and return some json 
} 

public class BoundingBoxRequest
{
    public IList<BoundingBox> Boxes { get; set; }
}

その後、それを送り返して逆シリアル化できるはずです。

于 2012-10-12T05:00:06.790 に答える