2014-03-13 76 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); 
} 

依此类推,直到你达到这个级别中,你需要获得的字符串资源。