0

MVC2 WebアプリでJsonValueProviderFactoryを使用して、iOSiPadアプリからのJSONリクエストを処理しています。

JSONを型にマップしたくありません。生のJSONを受け取り、それをモデルに渡して処理したいだけです。コントローラに渡される生のJSONにアクセスできるようにするには、コントローラのアクションにどのような署名が必要ですか?

これが私がこれまでに試した3つです。それらのどれも機能しません:

[ValidateInput(false)] // Allow dodgy chars in the JSON e.g. "<aa>"
        [HttpPost]
        //public ActionResult PushObject(FormCollection form) // no joy
        //public ActionResult PushObject(List<string> parms) // no joy
        //public ActionResult PushObject(string jsonRequest) // no joy
        {...
4

1 に答える 1

0

JsonValueProviderFactoryRAW JSONを取得したいのに、なぜを使用しているのですか。このファクトリの要点は、ビューモデルにマップすることです(ちなみに、これは正しい方法です)。Rawのものを入手したい場合は、いつでも読むことができますがRequest.InputStream、それは絶対に恐ろしいことです。

public ActionResult Do_Not_Do_This_Please_Use_ViewModels_Instead()
{
    Request.InputStream.Position = 0;
    using (var reader = new StreamReader(Request.InputStream))
    {
        string json = reader.ReadToEnd();
        ...
    }
    ...
}

少なくともこのがらくたをモデルバインダーに隠すことができます:

public class RawRequestModelBinder : DefaultModelBinder
{
    public override object  BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.HttpContext.Request;
        request.InputStream.Position = 0;
        using (var reader = new StreamReader(request.InputStream))
        {
            return reader.ReadToEnd();
        }
    }
}

次に、コントローラーアクションを実行します。

public ActionResult Do_Not_Do_This_Please_Use_ViewModels_Instead(
    [ModelBinder(typeof(RawRequestModelBinder))] string rawJson
)
{
    ...
}

しかしもちろん、これを行う正しい方法は、iPhoneが送信するJSON構造を反映するビューモデルを使用することです。

public ActionResult Foo(MyViewModel model)
{
    ...
}
于 2012-07-18T16:24:49.307 に答える