Домашняя страница 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
при доступе к конкретным маршрутам.