1

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

是否可以在我的区域视图脚本中覆盖资源路径中的“~”(波浪号)字符的行为以始终引用区域根而不是应用程序根?

或者,是否有另一种通用方法来引用区域根?

例子:

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

注意:这背后的基本原理是,我正在从几个较小的应用程序组成一个 ASP.NET MVC Web 应用程序,并且我想确保这些应用程序可以轻松地再次分解并根据需要重新排列,包括将它们分离回如有必要,他们自己的应用程序将在路上运行,而无需遍历并拆分我所有的资源/脚本文件或更改一堆明确定义的路径。

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

4

1 回答 1

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 "~";
}
于 2014-04-21T17:23:29.180 回答