![](/img/trans.png)
[英]How to route URLs like /controller/action-name to controller/action_name in ASP.NET MVC
[英]ASP.NET MVC route not resolving controller/action
我在名为Public
的区域内有一个名为DocumentsController
的控制器。
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 ,并按预期方式调用action方法。
我究竟做错了什么?
我编辑了答案,因为无法在您的代码示例中看到您是从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路由的托管模块。
最后告诉您将其添加到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" }
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.