目前,我的某个区域中有一个图像文件夹:~/Areas/AreaName/Images/
因此,为了显示图像,我必须运行:url.com/Areas/AreaName/Images/Image.jpg
但是,为了清洁起见,我想将网址AreaName/Images/Image.jpg
路由到~/Areas/AreaName/Images/Image.jpg
的实际位置。
我如何在AreaRegistration
中执行此操作?我理解如何将URL模式映射到控制器/操作等,而不是如何将文件夹映射到另一个。我可能首先使用AreaRegistration
来混淆自己,因为这种情况不涉及控制器/操作,而只涉及图像的位置。
据我所知,我在context.MapRoute()
尝试做的事情并没有超载。
任何方向都表示赞赏。
答案 0 :(得分:2)
默认情况下,当文件请求(在这种情况下为Image.jpg
)出现时,IIS将直接从该位置提供服务。它不会通过MVC请求管道。因此,您无法在代码配置中更改路径/ url。
您有2个选项
将静态内容移动到应用程序根目录,您可以在该文件夹中将其组织到与区域名称(或您喜欢的任何名称)匹配的文件夹中,并在这些区域的视图中引用它。
通过代码渲染图像。在此方法中,您可以编写一个操作方法,该方法接受文件的唯一标识符(例如:唯一文件名/ id)并使用代码读取文件并返回FileResult。由于您要编写代码来读取文件,因此您可以从应用程序的任何位置读取它。您可以使用属性路由来为此操作方法定义漂亮(漂亮的)url模式。
这是一个简单示例,用于从文件夹中返回图像。请随时根据需要进行改进并使用它。
[System.Web.Mvc.Route("Images/{id}/")]
[System.Web.Mvc.Route("Images/{area}/{id}")]
public ActionResult GetImage(string id,string area = "")
{
var webRoot = Path.Combine(Path.Combine("~/Contents/Img/", area), id) + ".png";
return File(webRoot, "image/png");
}
假设您在logo.png
目录中有一个名为~/Contents/Img
的图片(针对非区域相关网页),另一个图片专门针对您的 结算 区域在~/Contents/Img/Billing
中,您可以像
yourSiteName/Images/billing/logo
yourSiteName/Images/logo
我会选择选项1,因为我不希望图像请求通过MVC请求管道(除非我想为响应做一些奇特的事情,比如根据请求调整大小等等)。您也可以获得IIS级缓存。但是,嘿,选择适合你用例的那个。