2014-03-13 112 views
1

我正在編寫一個Html擴展來動態呈現局部視圖(視圖名稱/路徑由運行時由CMS提供)。MVC HTML助手,獲取當前局部視圖的父視圖

在我的擴展中,我需要確定包含部分的最外層視圖的名稱或路徑,如果視圖包含部分包含另一個部分包含另一個部分 - 我需要了解父視圖的標識。

在擴展方法中,我知道我可以通過HtmlHelper.ViewDataContainer屬性獲取直接父對象。這告訴我當前正在執行的擴展的上下文。我需要做的是迭代到它的父視圖,如果有的話。

+2

爲什麼你需要知道這個? – Benoit

+1

因爲我這樣做。你問來幹什麼? – StuTheDog

+2

爲了試圖瞭解你正在嘗試做什麼,所以我可以幫助你。 ... – Benoit

回答

3

如果您搜索controlleraction,你可以得到它,像這樣:

string action = html.ViewContext.RouteData.Values["action"].ToString(); 
string controller = html.ViewContext.RouteData.Values["controller"].ToString(); 
string url = "~/" + controller + "/" + action; 

爲了得到眼前的視圖(包括部分),它就像這樣:

var webPage = HtmlHelper.ViewDataContainer as WebPageBase; 
var virtualPath = webPage.VirtualPath; 

要獲得第一個視圖路徑(包含所有部分視圖的主視圖):

var viewPath = ((System.Web.Mvc.BuildManagerCompiledView)(htmlHelper.ViewContext.View)).ViewPath; 
+0

正確的感謝,我在OP中提到,我知道如何獲得直接父母以及控制器/操作,正如你已經證明的那樣。我試圖學習的是包含部分包含partials的情況下最頂部部分的視圖的名稱,該操作不會這樣做,因爲它可以根據情況調用許多不同的視圖。 – StuTheDog

+0

我已添加新信息以獲取第一個視圖Path,而不是直接部分,但控制器操作調用的視圖。現在,您可以閱讀視圖中的文本,然後查找所有的Html.Partial(「SomeName」)。我可以想象找到所有partialView的唯一方法是製作自己的Html.Partial或創建一個視圖引擎(http://www.codeproject.com/Articles/294297/Creating-your-own-MVC-View-Engine- into-MVC-Applica)並創建您自己的Hierarchy列表視圖/ PartialView – Benoit

+0

如果我知道您爲什麼需要這個值,那對我來說會更容易。如果是爲您的網絡應用程序或您爲其他項目創建插件。 – Benoit

0

我知道這已經得到了回答,它已經過了一年多了,但是會使用ViewData將視圖名稱從頂部傳遞到最遠嵌套的局部視圖工作?所以在ParentView你會做這樣的事情:

@{ 
    ViewData["ResourcePath"] = "ParentView"; 
    Html.RenderPartial("Partial1", Model, ViewData); 
} 

,然後在Partial1觀點:

@{ 
    ViewData["ResourcePath"] = ViewData["ResourcePath"] + "_Partial1"; 
    Html.RenderPartial("Partial2", Model, ViewData); 
} 

依此類推,直到你達到這個級別中,你需要獲得的字符串資源。