我正在編寫一個Html擴展來動態呈現局部視圖(視圖名稱/路徑由運行時由CMS提供)。MVC HTML助手,獲取當前局部視圖的父視圖
在我的擴展中,我需要確定包含部分的最外層視圖的名稱或路徑,如果視圖包含部分包含另一個部分包含另一個部分 - 我需要了解父視圖的標識。
在擴展方法中,我知道我可以通過HtmlHelper.ViewDataContainer屬性獲取直接父對象。這告訴我當前正在執行的擴展的上下文。我需要做的是迭代到它的父視圖,如果有的話。
我正在編寫一個Html擴展來動態呈現局部視圖(視圖名稱/路徑由運行時由CMS提供)。MVC HTML助手,獲取當前局部視圖的父視圖
在我的擴展中,我需要確定包含部分的最外層視圖的名稱或路徑,如果視圖包含部分包含另一個部分包含另一個部分 - 我需要了解父視圖的標識。
在擴展方法中,我知道我可以通過HtmlHelper.ViewDataContainer屬性獲取直接父對象。這告訴我當前正在執行的擴展的上下文。我需要做的是迭代到它的父視圖,如果有的話。
如果您搜索controller
和action
,你可以得到它,像這樣:
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;
正確的感謝,我在OP中提到,我知道如何獲得直接父母以及控制器/操作,正如你已經證明的那樣。我試圖學習的是包含部分包含partials的情況下最頂部部分的視圖的名稱,該操作不會這樣做,因爲它可以根據情況調用許多不同的視圖。 – StuTheDog
我已添加新信息以獲取第一個視圖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
如果我知道您爲什麼需要這個值,那對我來說會更容易。如果是爲您的網絡應用程序或您爲其他項目創建插件。 – Benoit
我知道這已經得到了回答,它已經過了一年多了,但是會使用ViewData將視圖名稱從頂部傳遞到最遠嵌套的局部視圖工作?所以在ParentView你會做這樣的事情:
@{
ViewData["ResourcePath"] = "ParentView";
Html.RenderPartial("Partial1", Model, ViewData);
}
,然後在Partial1觀點:
@{
ViewData["ResourcePath"] = ViewData["ResourcePath"] + "_Partial1";
Html.RenderPartial("Partial2", Model, ViewData);
}
依此類推,直到你達到這個級別中,你需要獲得的字符串資源。
爲什麼你需要知道這個? – Benoit
因爲我這樣做。你問來幹什麼? – StuTheDog
爲了試圖瞭解你正在嘗試做什麼,所以我可以幫助你。 ... – Benoit