0

Я работаю над проектом в ASP MVC 4. он работал хорошо. но несколько дней назад у меня была очень странная проблема. У меня есть контроллер «Dashboard», когда я называю его индексом как ~/Dashboard/index, он работает нормально, но если я его назову ~/Dashboard, я получил HTTP 404 не найденную ошибку.Asp Mvc 4 action не найден

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
       namespaces: new[] { "UI.Web.Controllers" } 
      ); 

я даже добавить маршрут конфигурации для управления Dashboard, но он не работает

routes.MapRoute(
      name: "Dashboard", 
      url: "Dashboard/{action}/{id}", 
      defaults: new { controller = "Dashboard", action = "Index", id = UrlParameter.Optional }, 
      namespaces: new string[] { "UI.Web.Controllers" } 
      ); 

же проблема в некоторых контроллеров в моей администратора области (некоторые из них работают хорошо, и некоторые дает HTTP 404 . не найдена ошибка Мой маршрут Область конфигурации является:

context.MapRoute(
       "DMS_Admin_default", 
       "Admin/{controller}/{action}/{id}", 
       new { controller = "Contact", action = "Index", id = UrlParameter.Optional }, 
       new string[] { "UI.Web.Areas.Admin.Controllers" } 
      ); 

в админке индекс действия некоторых контроллера не работает, и один контроллер, имеющий AddEdit действие, которое аль поэтому не работает.

public ActionResult AddEdit(string id) 
     { 
      var user = new Models.RegisterModel();//string.IsNullOrWhiteSpace(id) ? new Models.RegisterModel() : Membership.GetUser(id); 

      if (!string.IsNullOrWhiteSpace(id)) 
      { 
       var obj = Membership.GetUser(id); 
       if (obj != null) 
       { 
        user.Email = obj.Email; 
        user.UserName = obj.UserName; 
       } 
      } 

      ViewBag.PageTitle = string.IsNullOrWhiteSpace(id) ? "Add User" : "Edit User"; 
      ViewBag.IsAjax = Request.IsAjaxRequest(); 
      if (Request.IsAjaxRequest()) 
       return PartialView("~/Areas/Admin/Views/Users/AddEditPartial.cshtml", user); 
      return View("~/Areas/Admin/Views/Users/AddEdit.cshtml", user); 
     } 

в действии AddEdit, если я называю это как ~/Admin/User/AddEdit/а это работает, но если я называю это как ~/администратора/пользователя/AddEdit это также дает HTTP 404 не найдена ошибка.

такое поведение из-за некоторых проблем с обновлением фреймворка или проблемы с кодом? любая идея .... Я не думаю, что это проблема кодирования, потому что тот же код работал до ......

Теперь я был о завершении своего проекта, и на последнем этапе я застрял здесь.

полный routes.config это выглядит следующим образом:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

routes.MapRoute(
       name: "Dashboard", 
       url: "Dashboard/{action}/{id}", 
       defaults: new { controller = "Dashboard", action = "Index", id = UrlParameter.Optional }, 
       namespaces: new string[] { "UI.Web.Controllers" } 
       ); 

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

и мой AdminAreaRegistration код:

context.MapRoute(
       "DMS_Users", 
       "Admin/Users/{action}/{id}", 
       new { controller = "Users", action = "Index", id = UrlParameter.Optional }, 
       new string[] { "UI.Web.Areas.Admin.Controllers" } 
      ); 
context.MapRoute(
       "DMS_Admin_default", 
       "Admin/{controller}/{action}/{id}", 
       new { controller = "Contact", action = "Index", id = UrlParameter.Optional }, 
       new string[] { "UI.Web.Areas.Admin.Controllers" } 
      ); 
+1

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

ответ

1

Как Tieson Т. указал в комментарии, порядок, в котором маршруты добавляются вопросы , Первый сопоставленный маршрут будет сопоставлен с обработчиком.

Определение маршрутов может быть запутанным и затруднительным для диагностики. Я нашел следующие советы, полезные для работы с маршрутами:

  1. Debugging маршрутов: Вы можете использовать route debugger как объяснено here.
  2. Определите как можно меньше маршрутов в файле RouteConfig.

После того, как у вас есть дополнительная информация о том, какой URL-адрес сопоставлен с каким маршрутом, проще выяснить, как настроить порядок в файле RouteConfig.cs. Если вы все еще сталкиваетесь с проблемой, обменивайтесь всеми маршрутами в том же порядке и делитесь тем, у кого есть проблемы.

+0

Отладчик маршрута не работает на моей машине. когда я запускаю сайт в браузере, он показывает домашнюю страницу. route debegger также включен в web.config. может у объяснить, пожалуйста, подробно, как я могу заставить его работать или какой-либо подробный пример? – Anjum

+0

Вы видели эту ссылку http://www.itorian.com/2013/10/debugging-mvc-with-route-debugger-tool.html? Я использовал его один раз, и все, что я делал, это установить пакет nuget. – SBirthare

+0

да, я проверяю эту ссылку. но это не могло мне помочь – Anjum

0

Я не мог найти причину. поэтому, чтобы закончить мой проект, я перемещаю все мои контроллеры из области администрирования в корневой каталог. и это работает для меня. , но вопрос все еще есть, почему это произошло и как решить это.

+0

Если на вопрос не был дан ответ, вы должны оставить его открытым, а не отмечать это как правильный ответ. –

0

Добавить действие по умолчанию маршрут:

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

Для админки:

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