2013-11-01 28 views
3

应该在动作中调用PartialView()使用布局?部分视图应该使用指定的布局吗?

这里是我的操作:

public ActionResult SomeAction() 
{ 
    if (Request.IsAjaxRequest()) 
     return PartialView(); 
    else 
     return View(); 

}

这里是我的_ViewStart.cshtml:

@{ 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

方案1:行动呼吁没有指定布局的视图。

@{ 
    //Layout = "~/Views/Shared/_SomeLayout.cshtml"; 
} 
<h2>View!</h2> 
  • 查看的结果:该视图被包裹在一个布局
  • PartialView的结果:该视图不裹布局

这是从达林季米特洛夫后盾this response

场景#2:动作调用具有指定布局的视图。

@{ 
    Layout = "~/Views/Shared/_SomeLayout.cshtml"; 
} 
<h2>View!</h2> 
  • 查看的结果:该视图被包裹在一个布局
  • PartialView的结果:鉴于仍然包裹在布局

这也似乎是由this other response备份来自Darin Dimitrov。 (注意:即使他的回答是针对AJAX请求的全部答案,但这是针对OP有两个视图,一个完整视图和一个局部视图的问题的回答。)

因此,第一个问题是Darin解释说如果你不想要一个布局,使用PartialView(),但在第二个他说如果你不想布局,然后这是一个解决方法。

有人可以向我解释,如果有什么我失踪或为什么这样。不管达林如何说,如果我只设置_ViewStart.cshtml的布局,那么我可以用PartialView()忽略它,但是如果我在View中设置了另一个布局,那么我不能忽略它。

这是否有意义?我应该能够忽略这两种布局吗?如果不是,为什么?

回答

3

整个页面或部分页面的渲染过程在Razor中是相同的,因为它们使用相同的基类。对于渲染过程,整页和部分页面都会创建一个RazorView对象,但具有不同的构造函数参数。 从源代码中可以看出这两种渲染视图的方法。 System.Web.Mvc命名空间RazorViewEngine.cs

protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) 
    { 
     return new RazorView(controllerContext, partialPath, 
           layoutPath: null, runViewStartPages: false, viewStartFileExtensions: FileExtensions, viewPageActivator: ViewPageActivator) 
     { 
       DisplayModeProvider = DisplayModeProvider 
     }; 
    } 

protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) 
    { 
     var view = new RazorView(controllerContext, viewPath, 
            layoutPath: masterPath, runViewStartPages: true, viewStartFileExtensions: FileExtensions, viewPageActivator: ViewPageActivator) 
     { 
       DisplayModeProvider = DisplayModeProvider 
     }; 
     return view; 
    } 

查看,创建在构造参数的局部视图,layoutPath:null,runViewStartPages:false时。在你的场景#1中,这就是为什么视图包装在布局中,而不是部分视图。根据这些方法返回PartialView时,ViewStart不会执行,但在返回View时会执行。

partialView的默认布局为null,如构造函数参数中指定的那样。但是在ViewActionResult返回之后,可能已经指定了overriden布局。这就是你的场景#2中发生的情况。通过声明Layout = "~/Views/Shared/_SomeLayout.cshtml";您指定WebPageBase.Layout属性到某个路径,并且这覆盖了layoutPath:null。即使你返回PartialView()剃须刀也会生成完整的视图。同样,如果您在视图中声明Layout = null;,并且即使您从控制器返回View(),Razor也会生成partialView。因此,如果您返回View()PartialView(),则无论您的观点是部分还是全部视图,均不确定。这由Layout属性是否为null或某个路径决定。因此,对于更易读的代码,当您要生成partialView时,请使用return PartialView(),并且不要在视图中定义任何Layout。

相关问题