asp.net-mvc - MVC3 区域中的相对内容路径

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

我发现了这个问题 Can't use relative paths with areas in ASP.NET MVC 2这与我遇到的问题相同。在 MVC3 中仍然是这种情况吗?

有没有办法将内容文件保存在相对于该区域的区域中?

这样一个区域中的布局文件可以有类似的东西

无需建立完全限定的链接,需要区域目录和区域名称或上述问题的解决方案,即需要在每个请求上检查每个区域。

更新/编辑

我决定同时使用上述问题中的解决方案和下面的解决方案(html helper) - 取决于项目/情况。我的上述实现使用 app.setting 来存储区域名称和扩展名,以便我可以将模块作为我的库的一部分。

var context = HttpContext.Current;
var path = context.Request.Path;
var list = ...       //code that gets from app.config and then saves it
var extensions = ... // to the cache as non-removable with a dependency on web.config
foreach (var area in list)
{
   if (!path.Contains(area + "/")) continue;
   foreach (var extension in extensions)
   {
      if (path.EndsWith("." + extension))
      {
         context.RewritePath(path.Replace(area + "/", "Areas/" + area + "/"));
      }

    }
 }

最佳答案

我个人喜欢扩展方法路由,基于我想出的第一个答案并测试它是否有效......而不是使用 @Url.Content , 使用 @Url.ContentArea并且不需要输入'~/'、'/'或'../'等。

助手会进行一些检查以自动删除这些,所以就像这样使用......

@Url.ContentArea("Content/style.css") or @Url.ContentArea("Images/someimage.png") :)

当您创建此 Url Helper Extension 时,您的选择,但我在 Web 的根目录下创建了一个“Helpers”文件夹,然后我包含 @using YourWebNameSpace.Helpers;在我的_Layout.cshtml ( Razor /母版页)在我所在的任何“区域”中。

您仍然可以使用 @Url.Content用于当前区域之外的引用(基本上您可以根据所需资源及其位置进行混合)。
namespace YourWebNamespace.Helpers
{
    public static class UrlHelperExtensions
    {
        public static string ContentArea(this UrlHelper url, string path)
        {
            var area = url.RequestContext.RouteData.DataTokens["area"];

            if (area != null)
            {
                if (!string.IsNullOrEmpty(area.ToString()))
                    area = "Areas/" + area;

                // Simple checks for '~/' and '/' at the
                // beginning of the path.
                if (path.StartsWith("~/"))
                    path = path.Remove(0, 2);

                if (path.StartsWith("/"))
                    path = path.Remove(0, 1);

                path = path.Replace("../", string.Empty);

                return VirtualPathUtility.ToAbsolute("~/" + area + "/" + path);
            }

            return string.Empty;
        }
    }
}

在您的母版页或任何页面中(仅适用于本示例的 Razor)...
@using YourWebNamespace.Helpers

<html lang="en">
<head>

    <link href="@Url.ContentArea("Content/reset.css")" media="screen" rel="stylesheet" type="text/css" />

    <link href="@Url.ContentArea("Content/style.css")" media="screen" rel="stylesheet" type="text/css" />

</head>
<body>

关于asp.net-mvc - MVC3 区域中的相对内容路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5130226/

相关文章:

asp.net-mvc - 区域是我要找的吗?

asp.net-mvc - VS 2010 开发工具包。模板

asp.net-mvc - 可以从全局路由访问 ASP.NET MVC3 区域 Controller ?

asp.net-mvc-3 - Asp.Net MVC 3 - 映射已经属于某个区域的单独路线

asp.net-mvc-3 - 正在从根请求调用区域 Controller

c# - TextBoxFor decimal

c# - 如何安排在我的 MVC 网络应用程序中自动运行 Controller ?

c# - .cshtml(Razor View 代码)与 .cs 中的 Html Helper 扩展

c# - 为带有子文件夹的 ASP.NET MVC 区域路由生成 URL

asp.net-mvc - 从 MVC 区域的 _Layout.cshtml 添加数据到公共(public) _Layout.cshtml