Van Hua Ответов: 5

ASP MVC Route Config - ресурс не может быть найден ошибка


Я новичок в asp mvc, в настоящее время моя структура демо-проекта выглядит следующим образом:

Areas -- Comment -- Controller -- HomeController
                               -- ManageController

Controller -- HomeController
          |-- CommentController
                     |____ PostMsg
                     |____ DeleteMsg
Views -- Home
     |     |--- Index.cshtml
     |-- Comment
           |--- PostMsg.cshtml
           |--- DeleteMsg.cshtml

Когда я просматриваю url-адрес, например :
http://localhost/Comment/Manage/ --> return view successfully
http://localhost/Comment/PostMsg --> error "The resource cannot be found."

У кого-нибудь есть идеи, почему asp mvc не разрешает мой контроллер :-(
вот моя конфигурация маршрута global.asax.cs:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    namespaces: new[] { "Demo.Web.Controllers" }
                );

вот моя конфигурация маршрута регистрации области:
public override void RegisterArea(AreaRegistrationContext context)
            {
                context.MapRoute(
                    "Comment_default",
                    "Comment/{controller}/{action}/{id}",
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    new[] { "Demo.Web.Areas.Comment.Controllers" }
                );
            }

Проблема : комментарий/PostMsg URL-адрес был разрешен в качестве регулятора в области комментария

Цель : URL-адрес Comment/PostMsg был разрешен как действие CommentController
Любая помощь будет оценена по достоинству :-)

ПРОБЛЕМА РЕШЕНА измените оформление участка маршрута конфигурации (обойти):

public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Comment_default",
                "Comment/PostMsg",
                new { controller = "Comment", action = "PostMsg", id = UrlParameter.Optional },
                new[] { "Demo.Web.Controllers" }
            );

            context.MapRoute(
                "Comment_default",
                "Comment/{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new[] { "Demo.Web.Areas.Comment.Controllers" }
            );
        }

5 Ответов

Рейтинг:
38

Van Hua

Изменить оформление участка маршрута конфигурации (обойти):

public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Comment_default",
                "Comment/PostMsg",
                new { controller = "Comment", action = "PostMsg", id = UrlParameter.Optional },
                new[] { "Demo.Web.Controllers" }
            );
 
            context.MapRoute(
                "Comment_default",
                "Comment/{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new[] { "Demo.Web.Areas.Comment.Controllers" }
            );
        }


Рейтинг:
2

mhd.sbt

это мой пример кода, который работает правильно

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

            routes.MapRoute(
     "viewstudent", // Route name
     "view/viewstudent/{stdid}", // URL with parameters
     new { controller = "Movie", action = "SelectById", id = UrlParameter.Optional } // Parameter defaults
     );

            routes.MapRoute(
       "Default", // Route name
       "{controller}/{action}/{id}", // URL with parameters
       new { controller = "Home", action = "Index", id = UrlParameter.Optional }// Parameter defaults
);
                
    
        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterRoutes(RouteTable.Routes);
         
        RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);  
        
        }


Van Hua

Хм.. похоже, вы не понимаете моей проблемы :-( главная проблема здесь-конфликт имен между CommentController и CommentAreas.
В вашей демо-версии вы добавляете определенный url-адрес, который имеет другое имя с вашим контроллером и не создает никаких конфликтных областей.

Рейтинг:
2

mhd.sbt

ладно
вы можете добавить непосредственно два maprout в globalasx.cs
например вы можете сделать это:

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


routes.MapRoute(
                    "Comment_default",
                    "Comment/{controller}/{action}/{id}",
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                    new[] { "Demo.Web.Areas.Comment.Controllers" }
                );


Van Hua

Районная регистрация.RegisterAllAreas(); уже сделал это для меня

Рейтинг:
1

junaidengineer

Перейдите на страницу свойств веб-проекта и выберите вкладку Веб. В разделе начать действие установите его на определенную страницу, но оставьте текстовое поле пустым.


Рейтинг:
1

Member 10420541

Добавьте следующий код в файл Global.asax.

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
           GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            
        }


CHill60

Разве вы не заметили, что это было решено более 5 лет назад? Зеленый баннер в заголовке решения указывает на то, что ОП принял решение.
Придерживайтесь ответов на новые сообщения, где ОП все еще нуждается в помощи