ASP.. NET MVC路由:如何省略“索引”?从URL

本文关键字:索引 URL 何省略 MVC NET 路由 ASP | 更新日期: 2023-09-27 18:09:09

我有一个名为"StuffController"的控制器,具有无参数索引操作。我希望这个动作从一个URL的形式mysite.com/stuff

调用我的控制器被定义为
public class StuffController : BaseController
{
    public ActionResult Index()
    {
        // Return list of Stuff
    }
}

我添加了自定义路由,所以路由是这样定义的:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    // Custom route to show index
    routes.MapRoute(
        name: "StuffList",
        url: "Stuff",
        defaults: new { controller = "Stuff", action = "Index" }
    );

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

但是当我尝试浏览到mysite.com/stuff时,我得到一个错误

HTTP错误403.14 -被禁止

Web服务器配置为不列出该目录的内容。

URL mysite.com/stuff/index工作正常。我做错了什么?

ASP.. NET MVC路由:如何省略“索引”?从URL

HTTP Error 403.14 - Forbidden Web服务器配置为不列出该目录的内容。

错误表明您在项目中有一个名为/Stuff的虚拟目录(可能是物理目录)。默认情况下,IIS将首先到达此目录并查找默认页面(例如/index.html),如果不存在默认页面,将尝试列出目录的内容(这需要配置设置)。

这一切都发生在IIS将调用传递给. net路由之前,因此使用名称为/Stuff的目录会导致应用程序无法正常运行。您需要删除名为/Stuff的目录,或者为您的路由使用不同的名称。

正如其他人提到的,默认路由涵盖了这种情况,所以在这种情况下不需要自定义路由。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    // Passing the URL `/Stuff` will match this route and cause it
    // to look for a controller named `StuffController` with action named `Index`.
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

似乎您的场景被默认路由覆盖得很好,因此不需要自定义Stuff

至于为什么会抛出错误,action被列在默认值中并不意味着它实际上成为了路由的一部分。应该在路由中提到它,否则看起来就像根本没有动作一样。所以我认为这里发生的事情是第一个路由是匹配的,但它不能被处理,因为没有指定的动作,所以MVC将请求传递给IIS,它抛出命名的错误。

修复方法很简单:

// Custom route to show index
routes.MapRoute(
    name: "StuffList",
    url: "Stuff/{action}",
    defaults: new { controller = "Stuff", action = "Index" }
);

但是,你根本不需要这个