MVC3领域的相对内容路径

Ton*_*llo 15 asp.net-mvc asp.net-mvc-areas

我发现这个问题不能使用ASP.NET MVC 2中的区域的相对路径,这与我遇到的问题相同.在MVC3中仍然如此吗?

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

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

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

更新/编辑

我决定使用上面问题中的解决方案和下面的解决方案(html帮助程序) - 取决于项目/情况.我上面的实现使用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 + "/"));
      }

    }
 }
Run Code Online (Sandbox Code Playgroud)

小智 18

我个人比较喜欢的扩展方法路线的基础上,第一个答案我想出了这个和测试,它的作品...除了使用的@Url.Content,使用@Url.ContentArea并没有必要把在"〜/","/"或" ../ '等等..

帮助器做了一些检查以自动删除这些,所以只需使用就像这样......

@Url.ContentArea("Content/style.css") or @Url.ContentArea("Images/someimage.png") :)
Run Code Online (Sandbox Code Playgroud)

当您创建此Url Helper Extension时,您可以选择,但我在网络根目录下创建了一个"帮助者"文件夹,然后我@using YourWebNameSpace.Helpers;在我的_Layout.cshtml(razor/masterpage)中包含了我所在的"区域".

您仍然可以使用@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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的母版页或任何页面中(仅适用于此示例的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>
Run Code Online (Sandbox Code Playgroud)


Edu*_*añó 4

您可以尝试在 HtmlHelper 上创建扩展来解决此问题:

public static string Image(this HtmlHelper html, string imagePath)
{
    var area = html.ViewContext.RouteData.Values["area"];
    if (!string.IsNullOrEmpty(area))
        area = "Areas/" + area + "/";
    return VirtualPathUtility.ToAbsolute("~/" + area + "Content/img/" + imagePath);
}
Run Code Online (Sandbox Code Playgroud)

所以在你看来你可以使用:

<img src="@Html.Image("myimage.png")" alt="..." />
Run Code Online (Sandbox Code Playgroud)

我没有尝试该代码,所以如果我错了,请纠正我。