Jquery 控制器可以根据结果返回JSON或HTML
假设我有一个包含表单的弹出窗口。我必须有一个处理表单的控制器,根据结果,该控制器返回JSON(如果一切顺利,弹出窗口可以通过javascript关闭)或HTML(如果表单数据无效,表单必须替换为新的HTML,并显示验证错误消息)。 所以我找到了这样一个解决方案:那就是形式:Jquery 控制器可以根据结果返回JSON或HTML,jquery,ajax,asp.net-mvc,asp.net-mvc-4,Jquery,Ajax,Asp.net Mvc,Asp.net Mvc 4,假设我有一个包含表单的弹出窗口。我必须有一个处理表单的控制器,根据结果,该控制器返回JSON(如果一切顺利,弹出窗口可以通过javascript关闭)或HTML(如果表单数据无效,表单必须替换为新的HTML,并显示验证错误消息)。 所以我找到了这样一个解决方案:那就是形式: <form id="message" ...> ... </form> 控制器: [HttpPost] public ActionResult UpdateMessage(MessageMo
<form id="message" ...>
...
</form>
控制器:
[HttpPost]
public ActionResult UpdateMessage(MessageModel model)
{
...
if (.. is valided ..)
return Json(new { success = "OK" });
else
return View(model);
}
问题是,对于这样的任务,有没有更优雅的解决方案?我想这是解决这个问题的一个非常好的解决方案,我肯定会使用它。你的方法看起来不错。但是,如果您的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);
}
}
如果需要从URL返回多个数据类型,则无需在jQueryAjax调用中传递该数据类型`
$.ajax({
type: "GET",
url: url,
data: data,
//dataType: "json", comment this line
cache: false,
beforeSend: function () {},
success: function (data) {},
error: function (xhr, ajaxOptions, errorThrown) {}
});
为什么不在json键中返回html以保持清晰,并简单地检查是否设置了错误键?@fliespl,在服务器上将ASP.NET MVC视图呈现为字符串并将这些部分序列化为json有点麻烦。真的吗?如果我没记错的话,你只需要几行就可以渲染部分-可能与代码中的数字相同:)@fliespl,是的,有一些黑客可以做到这一点,但我总是发现它们,嗯,黑客。@DarinDimitrov我不是ASP.NET的专家-我只记得在这种情况下重新定义了partials-很高兴知道这些都被视为黑客。同意,您的解决方案没有问题。看起来不错。好的,谢谢你的回答。我只是觉得类似的任务经常发生,也许有一些标准的解决方案。因此,为了避免重新发明方形轮子,不知道世界各地长期以来都喜欢圆形轮子:)在我的例子中,如果一切正常,控制器将返回JSON。错误将返回到HTML中。而“TODO”必须在客户端执行-在java脚本中。但是谢谢你的回答——在另一个地方它对我很有用;)
$.ajax({
type: "GET",
url: url,
data: data,
//dataType: "json", comment this line
cache: false,
beforeSend: function () {},
success: function (data) {},
error: function (xhr, ajaxOptions, errorThrown) {}
});