我敢肯定有多种方法可以做到这一点。我从控制器手动渲染视图,然后将渲染的视图作为JSON响应的一部分传回。
这保留了每个实体的责任。使用视图引擎仍然可以定位视图,并且可以重复使用它们。除了名称和模型类型外,控制器对视图的了解甚少或一无所知。
手动渲染public static class RenderHelper{ public static string PartialView( Controller controller, string viewName, object model ) { controller.ViewData.Model = model; using( var sw = new StringWriter() ) { var viewResult = ViewEngines.Engines.FindPartialView( controller.ControllerContext, viewName ); var viewContext = new ViewContext( controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw ); viewResult.View.Render( viewContext, sw ); viewResult.ViewEngine.ReleaseView( controller.ControllerContext, viewResult.View ); return sw.ToString(); } }}
在您的 *** 作方法中:
object model = null; // whatever you wantvar obj = new { someOtherProperty = "hello", view = RenderHelper.PartialView( this, "_PartialName", model ) };return Json( obj );
请注意,我返回的是匿名类型。您可以返回所需的任何(可序列化的)类型,只要它具有呈现视图的字符串属性即可。
测试中测试使用手动渲染的动作需要进行一些修改。这是由于渲染视图比在MVC管道中渲染视图要早一些。
手动渲染
- 输入动作方法
- 显式渲染视图<-这将使测试调用 *** 作变得困难
- 退出动作方法
自动渲染
- 输入动作方法
- 创建查看结果
- 退出动作方法
- 处理视图结果(从而渲染视图)
换句话说,我们的手动渲染过程开始了许多其他的 *** 作,这些 *** 作使测试变得困难(例如与构建管理器进行交互以编译视图)。
假设您要测试 *** 作方法而不是视图的实际内容,则可以检查代码是否在托管环境中执行。
public static string PartialView( Controller controller, string viewName, object model ) { // returns false from a VS 2013 unit test, true from IIS if( !HostingEnvironment.IsHosted ) { // return whatever you want here return string.Empty; } // continue as usual }
检查
HostingEnvironment.IsHosted是廉价的(在幕后,这只是一个空检查)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)