我使用ASP.NET MVC与jQuery,并有很多Ajax请求给我的控制器。
使用部分视图(usercontrols)在页面加载时构建初始视图。然后,如果我需要根据我的Ajax请求附加/替换数据,我从Json响应构建HTML。
这种方法给了我充分的控制,即。如果发生错误,我可以从控制器获取额外的信息,然后根据该信息显示错误消息。
然而,最近我一直非常讨厌在我的部分视图和从Json生成HTML的部分中维护HTML结构的所有额外工作。
我喜欢制作一个jQuery ajax请求,然后控制器返回PartialView(“mypartialview”),然后只需使用jQuery替换为视图中的HTML。
但是,这样我无法从控制器附加额外的数据 – 无论是部分视图给出的,还是没有。至少这是我现在接受的。
如果某些验证在我的控制器操作的某个时候出错,我不想返回部分视图的HTML。
那么你怎么处理这个问题呢?
谢谢阅读。
解决方法
基于
this stackoverflow anwser我刚刚开始做同样的事情。
首先为controller类创建一个扩展方法。
public static string RenderViewToString(this Controller controller,string viewName,object model) { using (var writer = new StringWriter()) { var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext,viewName); controller.ViewData.Model = model; var viewCxt = new ViewContext(controller.ControllerContext,viewResult.View,controller.ViewData,controller.TempData,writer); viewCxt.View.Render(viewCxt,writer); return writer.ToString(); } }
然后在控制器操作方法中返回json。
return Json(new { Html = this.RenderViewToString("MyView",model),SomeExtraData = data });
您的ajax请求现在将收到包含其中的html的json。仍然尝试使用这种方法返回纯平的Html片段。
希望有帮助。
编辑更新以与剃刀一起使用