Возможно ли для asp.net MVC «Метод действия» получить JSON без объявления его конкретного типа в параметре? Если так, то как? - PullRequest
9 голосов
/ 31 декабря 2011

Итак, это в значительной степени все в названии.По сути, я хочу отправить JSON через JQuery от клиента на asp.net MVC.Мне интересно, возможно ли это получить (но не обязательно анализировать) любой JSON, который я хочу отправить из вызова JQuery Ajax, независимо от его типа ... без моего конкретного представления типа / моделиЭто.(в основном, как динамический тип?)

Делая это обычным способом (со мной, объявляя передаваемый аргумент как тип Object), просто получаю нулевые значения, что я и ожидал.

По сути, якогда я получу его, я захочу сделать что-то типа «отражения для JSON» и получить его свойства через какой-то цикл foreach и т. д.

Заранее спасибо.Любая помощь будет отличной!

1 Ответ

10 голосов
/ 31 декабря 2011

Вы можете использовать IDictionary<string, object> в качестве аргумента действия.Просто напишите пользовательский механизм связывания модели, который будет анализировать в нем запрос JSON:

public class DictionaryModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
        {
            return null;
        }

        controllerContext.HttpContext.Request.InputStream.Position = 0;
        using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream))
        {
            var json = reader.ReadToEnd();
            if (string.IsNullOrEmpty(json))
            {
                return null;
            }
            return new JavaScriptSerializer().DeserializeObject(json);
        }
    }
}

, который будет зарегистрирован в Application_Start:

ModelBinders.Binders.Add(typeof(IDictionary<string, object>), new DictionaryModelBinder());

, тогда вы можете выполнить следующее действие контроллера:

[HttpPost]
public ActionResult Foo(IDictionary<string, object> model)
{
    return Json(model);
}

, в который вы можете бросить все, что угодно:

var model = {
    foo: {
        bar: [ 1, 2, 3 ],
        baz: 'some baz value'
    }
};

$.ajax({
    url: '@Url.Action("foo")',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(model),
    success: function (result) {
        // TODO: process the results from the server
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...