Отправить JSON для MVC3 действий - PullRequest
5 голосов
/ 17 мая 2011

У меня есть форма, созданная с помощью Knockout.js.Когда пользователь нажимает кнопку отправки, я преобразую модель представления обратно в модель и пытаюсь отправить ее на сервер.Я попытался:

ko.utils.postJson(location.href, ko.toJSON(viewModel));

Но объект был пустым, когда он попал на сервер.Я переключился на этот код:

$.ajax({
    url: location.href, 
    type: "POST",
    data: ko.toJSON(viewModel),
    datatype: "json",
    contentType: "application/json charset=utf-8",
    success: function (data) { alert("success"); }, 
    error: function (data) { alert("error"); }
});

, который передает данные на сервер с правильными данными.

Но я хотел бы, чтобы данные были представлены такмой контроллер может перенаправить на правильный вид. Есть предложения?

Ответы [ 2 ]

11 голосов
/ 18 мая 2011

У Стива Сандерсона есть более старый пример, демонстрирующий правильную привязку отправленных данных JSON в действии вашего контроллера: http://blog.stevensanderson.com/2010/07/12/editing-a-variable-length-list-knockout-style/

Суть в том, что он создает атрибут с именем FromJson, который выглядит следующим образом:

public class FromJsonAttribute : CustomModelBinderAttribute
{
    private readonly static JavaScriptSerializer serializer = new JavaScriptSerializer();

    public override IModelBinder GetBinder()
    {
        return new JsonModelBinder();
    }

    private class JsonModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var stringified = controllerContext.HttpContext.Request[bindingContext.ModelName];
            if (string.IsNullOrEmpty(stringified))
                return null;
            return serializer.Deserialize(stringified, bindingContext.ModelType);
        }
    }
}

Тогда действие выглядит так:

    [HttpPost]
    public ActionResult Index([FromJson] IEnumerable<GiftModel> gifts)

Теперь вы можете использовать ko.utils.postJson для отправки ваших данных и ответа с соответствующим представлением.

0 голосов
/ 29 июня 2011

Кроме того, это в упомянутом примере, но вам может понадобиться изменить ваш вызов JavaScript на что-то вроде:

ko.utils.postJson(location.href, { viewModel: this.viewModel });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...