【问题标题】:ASP.NET MVC route not resolving controller/actionASP.NET MVC 路由不解析控制器/动作
【发布时间】:2016-01-01 22:57:00
【问题描述】:

我在一个名为 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,并且按预期调用操作方法。

我做错了什么?

【问题讨论】:

  • 你所说的`永远不会被调用。`是什么意思?抛出了什么异常?
  • 那么,如果使用默认路由实际上调用了您的操作,为什么需要自定义路由?
  • @jpgrassi 因为我想要一个像http://localhost/test/Public/Documents/Download/my-file.pdf 这样的干净网址而不是http://localhost/test/Public/Documents/Download?fileName=my-file.pdf
  • 检查我的答案,我想我发现您的自定义路线有什么问题。

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

我编辑了答案,因为我没有在您的代码示例中看到您从 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" }
    );
}

在 VS 2013 中使用 IIS Express 运行,此请求正确映射到 DownloadAsync 操作: http://localhost:1555/Public/Documents/Download/myfilename

但这不是(给我一个 404 错误): http://localhost:1555/Public/Documents/Download/myfilename.pdf

查看问题,我发现这篇博文说明了问题:

问题的原因与在传入请求上调用托管模块的时间有关。托管模块(与本机模块相比)仅针对映射到托管处理程序的请求执行。这当然包括对带有 .aspx 扩展名的 URL 的请求等等。但是,没有扩展名的 URL 不会映射到托管处理程序,因此不会调用负责 URL 路由的托管模块。

Using ASP.NET 4.0 Extension-less Routing on IIS 7.5

最后告诉你把这个添加到你的Web.config

<modules>
    <remove name="UrlRoutingModule-4.0" />
    <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>

【讨论】:

  • 这就是问题所在!谢谢!
  • 很高兴能提供帮助:)
【解决方案2】:

不确定是什么问题,以及为什么需要自定义路由。作为建议,修改您的区域注册类并删除自定义路由,仅保留默认路由

public override void RegisterArea(AreaRegistrationContext context)
{
            context.MapRoute(
                "Public_default",
                "Public/{controller}/{action}/{filename}",
                new { action = "Index", controller = "Documents" }
            );
}

【讨论】:

    猜你喜欢
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多