你不能改变 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 "~";
}