【问题标题】:ASP.NET MVC: How to reference the MVC Area root in View script paths?ASP.NET MVC:如何在查看脚本路径中引用 MVC 区域根?
【发布时间】:2014-04-21 17:08:12
【问题描述】:

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

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

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

示例:

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

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

当然,如果有更好的方法来实现这一点,我也愿意接受。

【问题讨论】:

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


    【解决方案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(请参阅我的 cmets 了解它为什么不是框架部分):

    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 "~";
    }
    

    【讨论】:

    • 还有其他方法可以确定Area根路径吗?一些内置方法或诸如此类的东西,所以我可以调用例如@Url.Content(GetAreaRoot() + "/path/to/stuff.file")?
    • 帽子确实不存在,因为 1. Area 没有路径,只是与之关联的命名空间 2. 对于视图,它基于 RazorViewEngine "~/Areas/{2}/ 中的路径Views/{1}/{0}.cshtml" 我用 GetAreaPath() 更新了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2010-12-09
    • 2018-05-31
    • 2019-09-07
    • 1970-01-01
    • 2011-03-17
    • 2011-11-30
    相关资源
    最近更新 更多