ASP.NET MVC路由未解析控制器/操作
本文关键字:控制器 操作 NET MVC 路由 ASP | 更新日期: 2023-09-27 18:28:35
我有一个名为DocumentsController
的控制器,位于名为Public
的区域内。
public class DocumentsController : AsyncController
{
public async Task<ActionResult> DownloadAsync(string fileName)
{
// ...
}
}
在PublicAreaRegistration.cs
文件中,我有以下路由设置:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(null, "Public/Documents/Download/{fileName}",
new { action = "Download", controller = "Documents", area = "Public" });
context.MapRoute(
"Public_default",
"Public/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional, area = "Public" });
}
在一个视图中,我调用Url.Action()
如下:
<a href="@Url.Action("Download", "Documents", new { area = "Public", fileName = document.FileName })">@document.FileName</a>
然而,尽管url已正确解析(http://localhost/test/Public/Documents/Download/my-file.pdf)该操作永远不会被调用。
但是,如果我完全删除了第一个MapRoute
调用,则url被解析为http://localhost/test/Public/Documents/Download?fileName=my-file.pdf,操作方法将按预期调用。
我做错了什么?
我编辑了答案,因为在您的代码示例中没有看到您从AsyncController继承的内容。尽管如此,我还是用这个设置创建了一个新项目:
PublicAreaRegistration.cs
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Documents",
"Public/Documents/Download/{fileName}",
new { action = "Download", controller = "Documents", area = "Public" });
context.MapRoute(
"Public_default",
"Public/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional, area = "Public" }
);
}
此请求在带有IIS Express的VS 2013中运行,已正确映射到DownloadAsync操作:http://localhost:1555/Public/Documents/Download/myfilename
但这并不是(给了我一个404错误):http://localhost:1555/Public/Documents/Download/myfilename.pdf
看看这个问题,我发现这篇博客文章说明了这个问题:
问题的原因与在传入请求中调用托管模块的时间有关。托管模块(相对于本机模块)仅针对映射到托管处理程序的请求执行。当然,这包括对扩展名为.aspx的URL的请求以及其他一些请求。但是,没有扩展名的URL不会映射到托管处理程序,因此不会调用负责URL路由的托管模块。
在IIS 7.5 上使用ASP.NET 4.0无扩展路由
最终告诉您将其添加到Web.config
:
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>
不确定问题出在哪里,以及为什么需要自定义路由。作为一个建议,修改您的区域注册类并删除只保留默认一个的自定义路线
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Public_default",
"Public/{controller}/{action}/{filename}",
new { action = "Index", controller = "Documents" }
);
}