我正在编写一个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