我正在使用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是一个“普通”表单提交。这就是我想要做的,所以应用程序的流程保持不变。
答案 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状态代码。这可以通过添加如上所示的批准处理程序来处理。