2013-04-05 4 views
1

Я сейчас работаю в заброшенном здании ASP.NET MVC 3 проект в VS2010.Неявное соединение методов действий с представлениями в ASP.NET MVC

В этом проекте виды и контроллеры находятся в отдельных проектах. Это не то, что я видел раньше. В каждом методе действия нет явного указания имени представления, как показано ниже.

return View("viewName",passingModel);//projects where controllers and views are in same 

Я сделал это неявно в VS2012 правой кнопкой мыши на представлении и сделать add view. Поэтому я не беспокоился о том, где эта связь между представлением возврата метода действия и представлением.

В отличии от VS2012, в VS2010 я не могу перейти к представлению, что связанно с одним конкретным способом действия, щелкнув правой кнопка мыши на View и делать go to view.

Я попытался понять это, выполнив этот небольшой эксперимент. Я создал Controller и создал Action Method звонок xxxx, и я создал представление для неявно, как упомянуто выше, и искал слово во всем решении, но это слово появилось только в контроллере и в представлении.

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

Edit:

Оба проекты, которые содержат контроллеры и представлениями являются библиотеками классов. а не проекты asp.net mvc.

Global.aspx файл содержит следующее:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
     { 
      filters.Add(new HandleErrorAttribute()); 
     } 

     protected void Application_Start() 
     { 
      DependenciesHelper.Register(new HttpContextWrapper(Context)); 

      AreaRegistration.RegisterAllAreas(); 

      RegisterGlobalFilters(GlobalFilters.Filters); 
      RoutingHelper.RegisterRoutes(RouteTable.Routes); 
     } 

     protected void Application_End() 
     { 
      //Should close the index 
      //If this method is not executed, the search engine will still work. 
      SearchService.CloseIndex(); 
     } 
+0

Я понимаю, что по соглашению, если вы звоните 'View' без имени вида он будет искать представление с тем же именем, что и действие. –

+0

@GeorgeDuckett У вас есть представление о том, как происходит соединение, когда контроллеры и представления находятся в отдельных проектах? –

+0

Думайте, что ваш разговор с Liverpool охватывает это, но в основном это происходит точно так же. Код MVC будет использовать отражение, чтобы найти соответствующие методы/классы и настроенную маршрутизацию. –

ответ

2

Отображение довольно проста. Например, если у вас есть контроллер под названием «MyBrilliantController» и метод действия называется «MyExcellentAction», который вернулся только return View(); было бы сопоставить (в проекте UI) ~/Views/MyBrilliant/MyExcellentAction.cshtml

Единственный раз, когда это отличается, когда вы работаете с «Областями» - но сопоставление фактически одинаково, оно просто рассмотрит первую папку области (то есть ~/Areas/MyArea/Views/MyBrilliant/MyExcellentAction.cshtml)

Надеюсь, что это поможет.

EDIT - Вы можете также указать пространство имен в файле global.asax на каждом маршруте для двигателя, чтобы найти контроллеры

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

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { 
       controller = "Home", 
       action = "Index", 
       id = UrlParameter.Optional 
     }, // Parameter defaults 
     new string[] { 
      // namespaces in which to find controllers for this route 
      "MySolution.MyControllersLib1.Helpers", 
      "MySolution.MyControllersLib2.Helpers", 
      "MySolution.MyControllersLib3.Helpers" 
     } 
    ); 

} 
+0

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

+0

Он будет отображаться точно так же. Это немного зависит от вашей маршрутизации и регистрации области (если вы используете Areas), но вы можете иметь 1000 контроллеров в 1000 отдельных DLL, и она все равно будет отображаться по умолчанию, пока вы не скажете об этом иначе. – LiverpoolsNumber9

+0

Я не знаком с Областями, в контроллерах проекта находятся отдельно в папке (папка не называется «Контроллеры», ее называют «Помощники»). Представления находятся в другом проекте, но они организованы в папке «Виды» и «Имя контроллера» «Папка», а затем «Представления». Это автоматически определяется структурой папок или должно указываться в 'Global.aspx'. Извините, я до сих пор не мог понять эту идею :( –

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