有谁知道如何获取正在调用的视图的当前文件夹?我也在使用AreasLib,所以我需要动态获取它而不需要前缀路径。例如,如果我执行http://localhost/myarea/mycontroller/myaction
,它将为我提供Project/Areas/myarea/Views/mysubsystem
的路径。所以是的,它需要是视图所在的文件夹。
编辑:或者编辑MvcSiteMap源代码来处理AreasLib。我没有真正掌握技能,或者更重要的是处理它的时间。
FINAL
它不漂亮,但我别无选择。我正在使用部分视图来使用以下帮助器呈现菜单组件以找到正确的视图。我不打算在这个版本中处理缺少的menu.ascx文件,但是假设现在总会有一个。
using System;
using System.Web;
using System.Runtime.CompilerServices;
using System.Web.Mvc;
namespace Intranet.Helpers
{
public static class StaticMenuHelper
{
public static string StaticMenu(this HtmlHelper helper, string area, string controller)
{
if (area.Equals("root"))
{
return "/Views/" + controller + "/menu.ascx";
}
else
{
return "/Areas/" + area + "/Views/" + controller + "/menu.ascx";
}
}
}
}
以下Site.Master
。
<div id="menu">
<% Html.RenderPartial(Html.StaticMenu(ViewContext.RouteData.Values["area"].ToString(), ViewContext.RouteData.Values["controller"].ToString())); %>
</div>
在MvcSiteMap成熟为可以处理AreasLib之后,我将不得不使用它。我真的,真的没有时间修改那个lib。
感谢您的帮助。
答案 0 :(得分:2)
嗯,在我看来,如果你从一个特定的控制器调用视图,那么从你已经知道的路径构建路径将非常简单。如果您在视图中需要它,则可以使用ViewData条目传递它。
所以,如果你这样做
http://localhost/myarea/mycontroller/myaction
然后你正在呼叫的控制器已经知道myarea,mycontroller和myaction。我假设您正在构建部分视图或Html辅助方法来处理菜单,因此当您渲染视图时,将myarea,mycontroller和myaction作为ViewData变量传递给视图。在您的视图中,将这些变量传递到局部视图或Html辅助方法。
或者,您可以从myarea,mycontroller和myaction构建路径,并将整个路径推送到您的视图中。
用法:
<%= Html.Menu(ViewData["Area"], ViewData["Controller"], ViewData["Action"]) %>
计算路径的示例函数:
string GetPath(string area, string controller, string action)
{
return "/project/areas/" + area + "/" + controller + "/" + action
}
编辑:正如Craig Stuntz指出的那样,您可以在视图中(通过ViewContext)获取路径值,而无需先将它们放入ViewData。这意味着您可以直接在菜单扩展方法中构建路径,前提是您可以以相同的方式获得区域。我不确定菲尔的东西是否支持。
ViewContext.RouteData.Values["controller"].ToString()
ViewContext.RouteData.Values["action"].ToString()
答案 1 :(得分:1)
这与视图的命名空间不一样吗?这很容易从视图本身进行检查。