在 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 个选择
将静态内容移动到应用程序根目录,您可以将其组织在与区域名称(或您喜欢的任何名称)匹配的文件夹中,并在这些区域的视图中引用它.
通过代码渲染图像。在这种方法中,您可以编写一个接受文件唯一标识符的操作方法(例如:唯一文件 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 级缓存。但是,嘿,选择适合您的用例的那个。
目前我的一个区域中有一个图像文件夹:~/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 个选择
将静态内容移动到应用程序根目录,您可以将其组织在与区域名称(或您喜欢的任何名称)匹配的文件夹中,并在这些区域的视图中引用它.
通过代码渲染图像。在这种方法中,您可以编写一个接受文件唯一标识符的操作方法(例如:唯一文件 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 级缓存。但是,嘿,选择适合您的用例的那个。