假设我有一个包含表单的弹出窗口。我必须有一个处理表单的控制器,并且根据结果,该控制器返回JSON(如果一切顺利,弹出可以通过javascript关闭)或HTML(如果表单数据无效且表单必须被替换)使用新的html - 带有验证错误消息)。 所以我找到了这样一个解决方案:那是形式:
<form id="message" ...>
...
</form>
我有这种形式的jquery处理程序:
$(document).on("submit", "form#message", function (evt) {
evt.preventDefault();
$.ajax({
type: this.method,
url: this.action,
data: $(this).serialize(),
success: function (result) {
if ($.isPlainObject(result)) {
// this is JSON
// close the pop-up window
} else {
// this is HTML
$("form#message").html(result);
}
}
});
});
控制器:
[HttpPost]
public ActionResult UpdateMessage(MessageModel model)
{
...
if (.. is valided ..)
return Json(new { success = "OK" });
else
return View(model);
}
问题 - 这些任务有更优雅的解决方案吗?
答案 0 :(得分:5)
恕我直言,这是一个非常好的解决方案,我肯定会使用这个问题。
答案 1 :(得分:2)
用你的方法看起来很好。但是,如果您的JSON错误消息对于所有屏幕都很常见,我建议您可以在这种情况下编写动作过滤器。所以我们可以使代码更优雅
[HttpPost]
[JsonErrorHandling]
public ActionResult UpdateMessage(MessageModel model)
{
return View(model);
}
public class JsonErrorHandlingAttribute : ActionFilterAttribute, IActionFilter
{
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
// TODO: doing some thing magic here
// if (.. is valided ..)
// return Json(new { success = "OK" });
this.OnActionExecuting(filterContext);
}
}
答案 2 :(得分:0)
如果需要从URL返回多种数据类型,则无需在jQuery AJAX调用中传递dataType。
$.ajax({
type: "GET",
url: url,
data: data,
//dataType: "json", comment this line
cache: false,
beforeSend: function () {},
success: function (data) {},
error: function (xhr, ajaxOptions, errorThrown) {}
});