2015-06-19 14 views
5

_Layout.cshtml中可以確定將在@RenderBody()中呈現哪個視圖?確定將在@RenderBody()中呈現的視圖

+0

你究竟需要什麼?這不太清楚你的意思。 –

+0

你想基於某些條件渲染不同的視圖嗎? –

+0

@AndreiV讓我們說,有/ Home/MyView我想在_Layout.cshtml裏面得到「MyView」 – gsharp

回答

11

您可以通過((RazorView)ViewContext.View).ViewPath

範例中得到視圖(即Index.cshtml)爲您的需求:

<script type="text/javascript" src="~/Content/Scripts/@(Path.GetFileNameWithoutExtension(Server.MapPath(((RazorView)ViewContext.View).ViewPath))).js"></script> 

如果您需要您的實際視圖(即_Layout.cshtml)您可以改用VirtualPath


老答案 閱讀您的意見,您要添加取決於視圖但@RenderBody()

<script ...>...</script> 

然後把

@RenderSection("Scripts", required:false) 

,並在您的視圖定義像

@section Scripts { 
    <script ...>...</script> 
} 

的部分,因此你不需要保持你的_Layout.cshtml因爲每一個視圖定義自己的腳本。

下面是一個簡單的解釋:http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts-and-sections-with-razor

+0

我知道我可以做到這一點,但它不是我想要的......我只是試驗如何將index.js添加到視圖index.cshtml(和detail.js到detail.cshtml等等.. )沒有任何手動輸入。我的想法是在_layout.cshtml中放置一段代碼,它將爲我工作...爲此我需要知道該視圖.. – gsharp

+1

我剛剛編輯了我的答案。那麼,這是你想達到的目標嗎? – Matt

+0

我讀@Matt編輯答案,並認爲這是最簡單的方法。 –

0

可以做的是檢查Html.ViewContext.RouteData.Values。這是一個帶有控制器,操作和id的字典(如有必要)。

+0

感謝您的回覆。不幸的是我需要知道視圖而不是行動。 – gsharp

0

閱讀this文章,它會解決你的問題。

編輯

RenderBody

什麼是RenderBody?

在佈局頁面中,呈現內容頁面中不是 的部分位於命名部分內。 [MSDN]

RenderBody如何工作(圖形演示)? enter image description here

+0

RenderBody()沒有任何重載的方法,所以顯然你不能定義你想渲染的視圖。 – Moh

0

@RenderBody()使得由所述控制器控制的圖。所以如果你的控制器是這樣的。

public class HomeController : Controller 
    { 
     public ActionResult Index() // Renders File /Views/Home/Index.cshtml 
     { 
      return View(); 
     } 

    } 

然後public ActionResult Index()Index.cshtml將是,它將使位於的int /查看/ Home文件夾視圖。

您可以添加到索引。cshtml_Layout.cshtml視圖渲染其他視圖局部視圖通過添加@Html.Partial("_MyView")如下所示。

 @Html.Partial("_LayoutHeaderHeader") 
     @Html.Partial("_LayoutHeaderNavbar") 

有時很容易設置幾個佈局頁面來從不同的視圖調用。

如果你想給你看,你總是應該在創建一個_PartialView,把你的腳本的局部視圖,並呼籲在你查看的這樣@Html.Partial("_MyView")底部是視圖和腳本將正確設置調用腳本。

這是一個很好的教程。 http://www.codeproject.com/Articles/698246/ASP-NET-MVC-Special-Views-Partial-View-and-Layout

+0

嗨Rich。這是行不通的,因爲你可以做返回視圖(「AnotherViewThatDoesntMatchTheActionName」) – gsharp

+0

我道歉,當我讀到的問題,我假設你正在尋找細節,以瞭解默認呈現的視圖。 –

0

如果你從一個基礎模型推導出所有的模型,那麼你可以將屬性添加到您返回控制器名稱,你可以開始使用

this.RouteData.Values["controller"].ToString();

這將是更好的示範基地如果你有一個BaseController類,因爲你可以把它放在構造函數中,而不必再次觸摸它。

由於您將基本模型的後代返回到具有控制器名稱的索引頁,現在您可以使用一些基於@Model.ControllerName的方案。如果您的控制器爲多個視圖提供服務,則可以更新該屬性以指示特定的視圖名稱。

我不認爲你可以在索引內部得到一個Partial的名字,除非你使用jquery,並且由於這一點頁面資源已經被加載。

編輯:另一個竅門是創建您自己的@ Html.Partial()HtmlHelper類的版本。因此,您有@ Html.MyPartial(「ViewName」)並在該方法內調用生成Html.Partial的內部函數,然後注入您的依賴關係。

+0

使用HtmlHelper類添加了另一個技巧。 –

0

編輯:我剛剛閱讀了您對該問題的評論,並認爲更好的方法是在另一個答案中使用由@Matt提供的代碼snipplet。

您可以在您的視圖中使用@section razor語句來通知應該加載的腳本。

佈局模板佔位

@RenderSection("scripts", required: false) 

查看代碼

@section scripts { 
    <script src="~/Scripts/custom-imgedit.js"></script> 
} 

上面的例子通知的自定義imgedit.js將在渲染部分佔位符被加載。注意:你甚至可以使用@ Scripts.Render(「〜/ bundles/myCustomScripts」)捆綁包