您无法更改 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 "~";
}