Домашняя страница MVC не работает, файлы RouteConfig и Global выглядят нормально

Я работаю в MVC 5 и взял на себя проект. Когда я захожу на домашнюю страницу mydomain.com, появляется сообщение об ошибке:

"Ошибка сервера в приложении" / ". Ресурс не найден. Описание: HTTP 404. Запрошенный URL:/"

Если я введу mydomain.com/home/index, он откроет домашнюю страницу, как и должно быть. Я полагаю, что это проблема RouteConfig.cs, но для меня все выглядит довольно по умолчанию.

namespace Source
{
    public class RouteConfig
    {
        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 }
            );

            routes.MapRoute(
                name: "Glossary2",
                url: "{controller}/{action}/{letter}",
                defaults: new { controller = "Teacher", action = "Glossary2", letter = UrlParameter.Optional }
                );

            /* Will need to finish this later.
             * When the contact us form is submitted, it should redirect to Home/Contact/{state}
             * where {state} can be either 'Success' or 'Error', which will display
             * an alert component in the view based on the provided {state}.
             */
            routes.MapRoute(
                name: "ContactSuccess",
                url: "{controller}/{action}/{submissionStatus}",
                defaults: new { controller = "Home", action = "Contact", submissionStatus = UrlParameter.Optional }
                );

            /* Will need to finish this later.
             * When the contact us form is displayed, it should check to see if a reason for contacting
             * us is already set. If it is, it should automatically select the appropriate reason on the
             * dropdown menu.
             */
            routes.MapRoute(
                name: "ContactReason",
                url: "{controller}/{action}/{reason}",
                defaults: new { controller = "Home", action = "Contact", reason = UrlParameter.Optional }
                );
        }
    }
}

Я не уверен в том, что делает CustomeViewEngine, и пока еще не очень с этим справился. Я также проверил файл Global.asax.cs, и он выглядит довольно стандартно.

namespace Source
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            ViewEngines.Engines.Add(new CustomViewEngine());
        }
    }
    public class CustomViewEngine : RazorViewEngine
    {
        public static readonly string[] CUSTOM_PARTIAL_VIEW_FORMATS = new[]
            { "~/Views/Selection/{0}.cshtml" };
        public CustomViewEngine()
        {
            base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(CUSTOM_PARTIAL_VIEW_FORMATS).ToArray();
        }
    }
}

Есть ли способ отследить, почему доменное имя не направляется в home/index? Если я добавлю сопоставление по умолчанию в конец файла RouteConfig, он захочет автоматически перейти на страницу входа. Опять же, я не совсем понимаю, почему это будет действовать так.

1 ответ

Решение

Я думаю, что ваши определения маршрута не в правильном порядке, порядок маршрута оценивается сверху вниз ( наиболее конкретный путь решается первым).

Следовательно, маршрут по умолчанию должен иметь место как последний определенный маршрут:

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

    // custom path at the top (or top-most depending on priority)
    routes.MapRoute(
        name: "Example",
        url: "Example/{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

    // default path at the bottom-most
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

Кроме того, все URL-адреса, определенные в каждом маршруте в образце, имеют один и тот же шаблон (используя {controller}/{action}/{parameter}), следовательно, это потенциально конфликт между собой. Вы можете использовать простые строки, чтобы различать похожие шаблоны маршрутов:

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

    routes.MapRoute(
        name: "Glossary2",
        url: "Teacher/{action}/{letter}",
        defaults: new { controller = "Teacher", action = "Glossary2", letter = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: "ContactSuccess",
        url: "{controller}/{action}/SubmissionStatus/{submissionStatus}",
        defaults: new { controller = "Home", action = "Contact", submissionStatus = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: "ContactReason",
        url: "{controller}/{action}/Reason/{reason}",
        defaults: new { controller = "Home", action = "Contact", reason = UrlParameter.Optional }
    );

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

Примечание. Используйте RouteDebugger, чтобы узнать, какие маршруты обрабатываются RouteConfig при доступе к конкретным маршрутам.

Другие вопросы по тегам