2013-05-15 2 views
0

У меня есть структура папок Посмотреть, как это:Моя маршрутизация не работает

Views 
    Rooms 
     Resorts 
      Index.cshtml 
      Suites.cshtml 
      ..... 

Я хочу структуру папок контроллера в соответствии

Controllers 
    Rooms 
     ResortsController.cs 

Я добавил новый MapRoute

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

Но контроллер для View не найден. Я пробовал localhost/Номера и localhost/Номера/Курорты/Индекс -

оба с таким же результатом.

Что мне не хватает?

EDIT: Мне нужно, чтобы URL-адреса выглядели как Номера/Курорты/Сьюты и т. Д. По бизнес-требованиям, и мне нужно сделать это, не используя Районы. У меня будет несколько URL-адресов, которые используют одно и то же имя Action, например Rooms/Resorts/Suites, Номера/Сьюты/Сьюты, Номера/AwesomeSuites/Suites. Таким образом, есть смысл использовать подпапки - организовать и иметь более одного вида с именем Suites.

Это то, что мне нужно сделать без использования областей?

+0

какое исключение вы получаете? – ssilas777

+1

Нет смысла использовать подкаталоги в разделе «Виды или контроллеры». – ZippyV

ответ

0

Ну, насколько я знаю, маршрутизация не заботится об этой дополнительной папке (Rooms), которую вы создали, чтобы она, скорее всего, попыталась разрешить представление из Views/Resorts /, а не из Views/Rooms/Resorts. Если вам нужно такое разделение, например, иметь ResortsController где-то еще в структуре, вы должны использовать Районы. Например, вы можете создать область с именем «Комнаты»!

+0

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

+0

@ TheGeekYouNeed - вы все еще не ответили на главный вопрос: есть ли у вас дубликаты имен контроллеров? –

+0

Нет, имена контроллеров будут соответствовать образцу URL-адреса в моем вопросе выше, поэтому Resorts.cs, Suites.cs, AwesomeSuites.cs и т. Д. – TheGeekYouNeed

0

Вы можете попробовать:

routes.MapRoute ( "Номера", "Номера/Курорты/{ID}", новый {контроллер = "Курорты", действие = "Index", ID = UrlParameter .Optional} );

0

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

public class CustomRazorViewEngine : RazorViewEngine 
{ 
    public CustomRazorViewEngine() 
    { 
     ViewLocationFormats = new string[] { "~/Views/%1/{1}/{0}.cshtml"}; 
     MasterLocationFormats = new string[] { "~/Views/%1/{1}/{0}.cshtml", 
         "~/Views/Shared/%1/{0}.cshtml"}; 
     PartialViewLocationFormats = new string[] { "~/Views/Rooms/{1}/{0}.cshtml", 
         "~/Views/Shared/%1/{0}.cshtml"}; 
     FileExtensions = new string[] { "cshtml"}; 
    } 

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) 
    { 
     var path = GetPath(controllerContext.Controller.GetType().Namespace); 
     return base.CreatePartialView(controllerContext, partialPath.Replace("%1", path)); 
    } 

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) 
    { 
     var path = GetPath(controllerContext.Controller.GetType().Namespace); 
     return base.CreateView(controllerContext, viewPath.Replace("%1", path), masterPath.Replace("%1", path)); 
    } 

    protected override bool FileExists(ControllerContext controllerContext, string virtualPath) 
    { 
     var path = GetPath(controllerContext.Controller.GetType().Namespace); 
     return base.FileExists(controllerContext, virtualPath.Replace("%1", path)); 
    } 


    private string GetPath(string nameSpace) 
    { 
     var split = nameSpace.Split('.'); 
     int startingIndex = 0; 
     StringBuilder sb = new StringBuilder(); 

     foreach(string s in split) 
     { 
      startingIndex++; 

      if (s == "Controllers") 
      { 
       break; 
      } 
     } 

     for(int x = startingIndex; x < split.Length; x++) 
     { 
      sb.Append(split[x]); 
      if (x != split.Length - 1) 
      { 
       sb.Append("/"); 
      } 
     } 

     return sb.ToString(); 
    } 

Так до тех пор, пока структура папки совпадает в папке Просмотр папок и контроллеров, то CustomRazorViewEngine найдет вид.

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