URL不包含索引时返回404

时间:2018-08-26 15:35:21

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

我在MVC中路由时遇到麻烦。我已经为我的联系页面创建了一个控制器,但是除非我将路由指定为/contact/index,否则它将返回404。我看不到为什么它无法在URL中仅使用/contact来查找视图。我的RouteConfig对我来说不错。

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

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

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

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

我看到它找不到其视图的唯一原因是由于我配置了新的Route,以显示站点等待页面。有趣的是,/t确实显示了“演示”主页,所以我看不出为什么它不仅仅像/contact一样。

This S.O文章告诉我,我可以通过给它自己的MapRoute来解决问题,但我不必做所有这些事情吗?

public class HomeController : Controller
{
     public ActionResult Index()
     {
        return View();
     }

     public ActionResult Holding()
     {
         return View();
     }
}

public class ContactController : Controller
{
    // GET: Contact
    public ActionResult Index()
    {
        return View();
    }
}

这一定是愚蠢的,但我无法解决。

1 个答案:

答案 0 :(得分:1)

您遇到路线冲突

/contact将匹配

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

但是由于联系人控制器没有Holding操作,您将得到 404 Not Found

并且由于它匹配了 Holding 路线,因此在第一个比赛获胜时不会继续执行下一个 Default 路线。

添加的路线过于笼统,因此会出现很多错误匹配。

基于所示的控制器,不需要添加的路由。保留路径仍将与默认路由模板匹配。因此实际上可以将其完全删除。