2013-11-01 64 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。

相關問題