ASP.NET MVC:如何在View脚本路径中引用MVC Area root?

时间:2014-04-21 17:08:12

标签: asp.net-mvc asp.net-mvc-areas asp.net-mvc-views

我有一个带有几个子区域的ASP.NET MVC 4应用程序。理想情况下,我希望每个区域尽可能独立,包括所有内容,图像等。

是否可以覆盖Area View脚本中资源路径中“〜”(代字号)字符的行为,以便始终引用Area root而不是Application root?

或者,是否有另一种引用Area root的通用方法?

示例:

@* Should point to "~/Areas/MyNiftyArea/Images/logo.png": *@
@Url.Content("~/Images/logo.png");

注意:这背后的基本原理是我从一些较小的应用程序编写单个ASP.NET MVC Web应用程序,我想确保应用程序可以轻松地再次打破并根据需要重新安排,包括必要时将它们分离回自己的应用程序,而不必经历和拆分所有资源/脚本文件或更改一堆明确定义的路径。

当然,如果有更好的方法来实现这一目标,我也会对此持开放态度。

1 个答案:

答案 0 :(得分:1)

您无法更改Url.Content的行为,它基本上会转到以下静态代码:

if (isAppRelative)
{
    string absoluteContentPath = VirtualPathUtility.ToAbsolute(contentPath, httpContext.Request.ApplicationPath);
    return GenerateClientUrlInternal(httpContext, absoluteContentPath);
}

但是,您当然可以编写自己的帮助程序并将其放在页面上。

你需要做什么用你自己的类覆盖ViewPage,通过在页面上指定@inherits来做到这一点(或者你可以在ViewStart中做到这一点,请参阅此博客以获取指针http://develoq.net/2011/how-to-change-base-type-of-razor-view-engine-pages

现在,您可以创建自己的UrlHelper属性,并确保在ViewPage中覆盖InitHelpers。原始代码确实:

public virtual void InitHelpers()
{
    Ajax = new AjaxHelper<object>(ViewContext, this);
    Html = new HtmlHelper<object>(ViewContext, this);
    Url = new UrlHelper(ViewContext.RequestContext);
}

将Url初始化程序替换为您自己的帮助程序。

我的个人观点 - 这似乎是一个非常大的锤子,你将复制大量资源,并可能进入错误和区域/区域兼容性问题。

根据您在下面的问题,您可以添加静态GetAreaPath(请参阅我的评论,说明为什么它不是框架部分):

public static string GetAreaPath()
{
    var routeData = HttpContext.Current.Request.RequestContext.RouteData;
    object areaobj;
    if (routeData.Values.TryGetValue("area", out areaobj))
    {
        string area = areaobj as string;

        if (area != null)
        {
            return @"~/Areas/" + area;
        }
    }

    return "~";
}