ASP.NET MVC rendering partial view with jQuery ajax
我有一个控制器动作,呈现局部视图:
1 2 3 4 5 6 | public ActionResult Details(int id) { DetailsViewModel model = ModelBuilder.GetDetailsViewModel(id, _repository); return PartialView("Details", model); } |
我将返回的内容加载到动态元素中,如下所示:
1 2 3 4 5 6 | $container = appendContainer(); // adds a div to the dom with the correct id $container.load("MyController/Details", function(response, status, xhr) { if (status !="success") { $(container).html('an error has occured'); } }); |
所以这会创建一个div,然后将返回的内容加载到该div中。
我想略微改变它,以便只在调用时创建容器div
控制器是成功的。
所以:
我很感激有关如何最好地实现这一点的任何指示。
在你的情况下,我会使用$ .ajax而不是.load()
让您更好地控制流量+感觉更干净
1 2 3 4 5 6 7 8 9 10 11 12 13 | $.ajax({ url:"MyController/Details", type:"GET", success: function (response, status, xhr) { var jqContainer = appendContainer(); jqContainer.html(response); }, error:function(XMLHttpRequest, textStatus, errorThrown) { //show the error somewhere - but this is a bad solution } }); |
关于错误状态 - 我也讨厌依赖异常 - 丑陋和低效,
你有几种方法可以解决这个问题:
在我的代码中,我使用$(document).ajaxSend(..)来全局检查278代码的所有Ajax响应并显示错误消息(如果有),或者调用原始的hooked success函数。
要从操作中返回错误,请使用以下结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class AjaxErrorWithDetailsResult : JsonResult { public object ErrorResult { get; set; } public AjaxErrorWithDetailsResult(object errorResult) { this.ErrorResult = errorResult; } public override void ExecuteResult(ControllerContext context) { if (context == null) { throw new ArgumentNullException("context"); } this.Data = ErrorResult; context.HttpContext.Response.StatusCode = 278; base.ExecuteResult(context); } } |
其中ErrorResult可以是一个匿名对象,也可以是一个实现具有ErrorMessage属性的接口的对象,因此您将知道在JS中寻找什么
所有
1 2 3 4 5 6 7 8 9 10 11 12 | var $dummy = $(""); $dummy.load("MyController/Details", function(response, status, xhr) { var $container = appendContainer(); if (status !="success") { $container.html('an error has occured'); } else { $container.html($dummy.html()); } $dummy.remove(); }); |
更新:
如果您期待异常,那么您应该处理它。如果你基本上允许错误发生只是为了得到
1 2 3 4 5 6 7 8 9 10 11 12 13 | public ActionResult Details(int id) { try { DetailsViewModel model = ModelBuilder.GetDetailsViewModel(id, _repository); return PartialView("Details", model); } catch (SomeException ex) { return PartialView("Error", ex.Message); } } |
然后,您可以保证始终获得有效的HTML响应,如果不这样做,那么您的基本错误