在 ASP.NET MVC 区域中更改/重新映射图像文件夹 url

Changing / remapping image folder url in ASP.NET MVC Area

目前我的一个区域中有一个图像文件夹:~/Areas/AreaName/Images/

所以为了显示图像,我必须运行通过:url.com/Areas/AreaName/Images/Image.jpg

但是,为了清洁起见,我想将 URL AreaName/Images/Image.jpg 路由到实际位置:~/Areas/AreaName/Images/Image.jpg.

如何在 AreaRegistration 中执行此操作?我了解如何将 URL 模式映射到控制器/操作等,但不知道如何将文件夹映射到另一个文件夹。我可能一开始就使用 AreaRegistration 让自己感到困惑,因为这种情况不涉及控制器/动作,而只是图像的位置。

据我所知,我在 context.MapRoute() 中尝试做的事情没有超载。

欢迎任何指导。

默认情况下,当文件请求(在本例中为 Image.jpg)到来时,IIS 将直接从该位置提供服务。它不会通过 MVC 请求管道。因此,您无法在代码配置中更改 path/url.

您有 2 个选择

  1. 将静态内容移动到应用程序根目录,您可以将其组织在与区域名称(或您喜欢的任何名称)匹配的文件夹中,并在这些区域的视图中引用它.

  2. 通过代码渲染图像。在这种方法中,您可以编写一个接受文件唯一标识符的操作方法(例如:唯一文件 name/id)并使用代码和 return FileResult 读取文件。由于您正在编写代码来读取文件,因此您可以从应用程序的任何位置读取它。您可以使用属性路由来定义此操作方法的漂亮(漂亮)url 模式。

这是文件夹中 return 图片的 简单 示例。请随时根据需要改进并使用它。

[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");
}

假设您在 ~/Contents/Img 目录中有一个名为 logo.png 的图像(用于非区域相关页面)和另一个特定于您的 Billing区在~/Contents/Img/Billing,你可以像

一样请求他们

yourSiteName/Images/billing/logo

yourSiteName/Images/logo

我会选择选项 1,因为我不希望图像请求通过 MVC 请求管道(除非我想对响应做一些花哨的事情,比如根据请求调整大小等等)。您还可以获得 IIS 级缓存。但是,嘿,选择适合您的用例的那个。