2013-12-23 5 views
0

Я пытаюсь использовать вложенные папки внутри папки Controllers:Asp.net MVC маршрутизации с помощью вложенных папок

структура выглядит следующим образом:

  • Controllers (Папка)
    • LoginController.cs
    • WelcomeController.cs
    • Установки (Папка)
      • UsersController.cs

Я несколько проблем. Когда я выполнить обратный RedirectToAction («Index», «добро пожаловать») из моего LoginController, URL-адрес выглядит как http://mywebsite.local/settings/welcome я думал, я получаю сообщение об ошибке 404 ..

Как сделать перенаправление запускает http://mywebsite.local/welcome и получить 404 при запуске http://mywebsite.local/settings/welcome

Нужно ли мне использовать Районы?

Это мой RouteConfig.cs

 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.MapRoute(
      name: "settings", 
      url: "settings/{controller}/{action}/{id}", 
      defaults: new { controller = "Users", action = "Index", id = UrlParameter.Optional } 
     );    

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

ответ

1

Структура папок ваших контроллеров здесь очень мало соответствует тому, что вы видите. Вы можете сохранить эту структуру и выполнить свою задачу, если маршрут будет работать.

Однако вы указали два подходящих маршрута, которые можно использовать для кодирования одного и того же действия, и он просто дает первый приоритет. Смотрите, маршруты не просто работают вперед, MVC также использует их в обратном порядке, чтобы обрабатывать ваши ____Action() заявления. Вы можете указать именованный маршрут (например, «настройки») в своем RedirectToAction("Index", "welcome"), используя вместо этого RedirectToRoute или вручную указать все маршруты с префиксами в таблице маршрутов. но зачем начинать свой проект с намеренно противоречивых маршрутов?

Как сказал Джо Р, районы сделают вашу жизнь проще. Зачем? В основном потому, что есть дополнительный встроенный параметр маршрута, чтобы делать именно то, что вы хотите. В самом деле, вопрос становится «зачем избегать Районов?»

7

ли мне действительно нужно использовать районы?

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

0

Похоже, ответ не отвечает на вопрос, потому что ИМХО, мы используем Area, когда нам нужна мини-программу по нашей основной программе,

т.е.. Форум, (Всеобъемлющий) Блог, Торговая площадка (под нашим основным сайтом) либо forum.mainsite.com, либо основной сайт.ком/форума

Так что вам не нужно Area в вашем случае

Решение:

FYI, маршрутизации является то, что не имеет ничего общего с вашей архитектурой/структурами/Файловыми в вашем Приложения.

В примере ваш ControllerName является SettingsUsersController

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

в вашем случае, вы можете исправить маршрутизацию, как это (это за то, чтобы у вас есть pretty url, но по-прежнему простой структуры контроллера):

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

Ваше имя Контролера будет SettingsUsersController

SettingsUsersController.cs

public class SettingsUsersController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View("~/Views/SettingsUsers/Index.cshtml", db.YourDBName.ToList()); 
    } 
} 

А почему 404? Я думаю, потому что вы не правильно настроили свой View, вы должны сделать подпапку, подобную этой папке вида. Views/SettingsUsers/Index.cshtml

Смежные вопросы