我有一个带有几个子区域的ASP.NET MVC 4应用程序。理想情况下,我希望每个区域尽可能独立,包括所有内容,图像等。
是否可以覆盖Area View脚本中资源路径中“〜”(代字号)字符的行为,以便始终引用Area root而不是Application root?
或者,是否有另一种引用Area root的通用方法?
示例:
@* Should point to "~/Areas/MyNiftyArea/Images/logo.png": *@
@Url.Content("~/Images/logo.png");
注意:这背后的基本原理是我从一些较小的应用程序编写单个ASP.NET MVC Web应用程序,我想确保应用程序可以轻松地再次打破并根据需要重新安排,包括必要时将它们分离回自己的应用程序,而不必经历和拆分所有资源/脚本文件或更改一堆明确定义的路径。
当然,如果有更好的方法来实现这一目标,我也会对此持开放态度。
答案 0 :(得分: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(请参阅我的评论,说明为什么它不是框架部分):
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 "~";
}