2014-06-09 29 views
0

我正在研究ASP.NET MVC3項目。我使用Twitter Bootstrap作爲我的造型(不知道這是否重要)。我遇到的問題是,Home控制器的Index.cshtml視圖與其他頁面的佈局稍有不同(在頂部的附加圖像導航中,一旦用戶選擇他想要去的地方,我不會顯示),但這會導致問題發生我從Index視圖中刪除此部分到另一個局部視圖_ImageNavigation.cshtml和我想要做的是呈現這個局部視圖的內容,當Home/Index.cshtml被打開,並且我想在它也獨立於它之前呈現它@RenderBody(),所以我得到頁面我想要的方式。如何在給定視圖上渲染html brefore RenderBody()從佈局中被觸發

現在在我_Layout.cshtml我:

<div id="main"> 

    <div class="container-fluid"> 
     <div class="row"> 
      <div class="col-md-10">@RenderBody() </div> 
      <div class="col-md-2"> 
      //some static content 
      </div> 
     </div> 
</div> 

所以,我有兩個想法第一 - @RenderBody()像前右加@RenderPage("~/Views/Shared/_ImageNavigation.cshtml")

<div class="row"> 
@RenderPage("~/Views/Shared/_ImageNavigation.cshtml") 
<div class="col-md-10">@RenderBody() </div> 

產生我想要的效果,但你可能會猜測_ImageNavigation呈現在每個不是我想要的頁面上。我只希望它在我的Home/Index.cshtml上,所以我猜測可能會進行某種檢查,以查看正在加載哪個視圖並僅在正確視圖時才呈現_ImageNavigation。例如:

if (LoadingView == Home/Index.cshtml) 
    { 
    @RenderPage("~/Views/Shared/_ImageNavigation.cshtml") 
    } 

當然,以上只是僞代碼,我不知道是否有可能以及如何進行這樣的檢查。我也想知道在頁面中是否有辦法做到這一點。我試圖將@RenderPage("~/Views/Shared/_ImageNavigation.cshtml")直接放在我的Home/Index.cshtml中,但很明顯,這種方式使頁面呈現,就好像代碼直接寫入視圖中一樣,而不是顯式加載。

也許還有其他的方法。這似乎是非常標準的問題,但我似乎找不到合適的解決方案。

回答

1

如果您有較少的例外情況,我喜歡使用章節。這裏是一個非常例如運動簡化:

佈局:

@if (IsSectionDefined("Nav")) 
{ 
    RenderSection("Nav") 
} 
else 
{ 
    <nav>default nav</nav> 
} 
@RenderBody() 

頁與替代導航:

@section Nav 
{ 
    <nav>My alternate nav</nav> 
} 

<div>This is the body for RenderBody</div> 

你可以閱讀更多的Defining Default Content For A Razor Layout Section - Phil Haacked

+0

感謝您的回答。我放慢了我的評論,因爲我遇到了問題:'@if(IsSectionDefined(「Nav」))''我得到這個錯誤:'以下部分已被定義,但尚未呈現爲佈局頁面。只留下'RenderSection(「Nav」)'解決了這個問題。打開其他頁面時我期待錯誤,但工作正常。我不知道是什麼導致了這一點,但似乎我沒有義務在每個視圖中定義部分以僅使用'RenderSection(「Nav」)'。 – Leron

+0

你可能想使用'RenderSection(「Nav」,false)'。 –

+0

是的,不知道爲什麼,我看到很多例子提示使用'IsSectionDefined()',但在我的情況下只是'RenderSection(「Nav」,false)'是不會導致死亡黃色屏幕的選項。感謝幫助。 – Leron