MVC默认路由不适用于控制器

时间:2016-06-07 17:43:04

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

我刚刚开始一个新的MVC项目,默认路由似乎没有像我期望的那样工作。

路由配置:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

我有ActionLink使用@Html.ActionLink("Scripts", "Index", "Scripts")进入“脚本”控制器上的“索引”操作。

public class ScriptsController : Controller
{
    public ActionResult Index()
    {
        var model = new IndexModel();
        .......
        return View(model);
    }
}

单击此链接时,浏览器会尝试导航到“http://localhost:1733/Scripts/”,浏览器会显示“目录列表被拒绝”错误。当我手动将URL更改为“http://localhost:1733/Scripts/Index”时,它可以正常工作。

默认路由不应自动推断“索引”操作吗? 它似乎适用于作为默认MVC网站模板一部分的ManageController类(“http://localhost:1733/Manage”会显示Index的{​​{1}} ActionResult

我做错了什么?

1 个答案:

答案 0 :(得分:6)

我猜你有一个实体" 脚本"在您的应用根目录中。您看到的错误消息是预期的行为。当/Scripts的GET请求到来时,IIS不知道是返回目录内容(Scripts)还是让mvc返回ScriptsController结果。这很令人困惑。

您应该尽量不将控制器命名为物理目录名称。更改任一名称。

如果您不想重命名其中任何一个,可以将RouteExistingFiles属性设置为true,以告诉框架路由是否应该处理与现有物理文件/目录匹配的URL。

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapMvcAttributeRoutes();

        routes.MapRoute("Default", "{controller}/{action}/{id}",
             new { controller = "Home", action = "Index", id = UrlParameter.Optional });

        routes.RouteExistingFiles = true;
    }
}

您需要确保ScriptsController中没有与物理文件/静态资源匹配的任何操作方法(例如:捆绑/最小化脚本资源名称)。