Knockout和ko.utils.postJson问题

时间:2011-08-24 10:38:35

标签: asp.net-mvc-3 jquery knockout.js

我正在使用MVC2的一个旧示例,它在将json发布到控制器动作时使用了[fromJson]属性,但它没有捕获模型错误,所以它工作正常,因此ModelState.IsValid始终为true。然后我看到发布JSON已经构建到MVC3中,所以我已经升级了我的代码。但现在我有另一个问题:)使用:

ko.utils.postJson(location.href, json); 

绑定无效,我的模型为空。

但是如果我使用JQuery:

$.ajax({
                            url: '@Url.Action("Create")',
                            contentType: 'application/json; charset=utf-8',
                            type: "POST",
                            data: json,
                            dataType: 'json',
                            success: function(result) {
                                alert("yay");
                            },
                            error: function(xhr, ajaxOptions, thrownError) {
                                alert(xhr.statusText + " " + xhr.responseText);
                            }
                        });

所以我想我会将我的ko.utils.postJson移动到JQuery $ .ajax但是我如何发布这样我之后可以做一个RedirectToAction?

所以澄清一下!控制器动作如下所示:

public ActionResult Create(QuestionViewModel questionViewModel){

    if (ModelState.IsValid)
    {
        questionViewModel.Save();

        TempData.Add(Config.MODEL, questionViewModel);
        return RedirectToAction("Edit");
    }

    PopulateViewBag();

    return View(questionViewModel);
}

我在Knockout论坛中找到了这个http://groups.google.com/group/knockoutjs/browse_thread/thread/e631a544de2ad51e,所以ko.utils.postJson是一个“普通”表单提交。这就是我想要做的,所以应用程序的流程保持不变。

1 个答案:

答案 0 :(得分:0)

由于$ .ajax()没有创建<form>标记并提交它,因此在ajax帖子中你不能做像RedirectToAction这样的事情。 ko.utils.postJson允许您完成所有操作,因为它在dom内部创建了一个快速表单标记并通过脚本提交。

你能做的是:

$.ajax({
  statusCode: {
    302: function() {
      window.location.replace("http://Domain.com/Controller/Edit")
    }
  }
});

This问题帮助我找到了通过脚本重定向浏览器的方法。 This页面告诉您如何处理服务器返回的不同状态代码。在Controller中使用RedirectToAction()时,ASP.NET MVC3返回302状态代码。这可以通过添加如上所示的批准处理程序来处理。