2010-02-02 4 views
4

Я только пробовал это в отдельных областях проекта. Поэтому, если кто-то попробует это в решении для нескольких проектов, пожалуйста, сообщите нам об этом.Решение для поддержки видов в однопроектных областях

Поддержка области была добавлена ​​в MVC2. Однако представления для ваших контроллеров должны быть в вашей главной папке Views. Решение, которое я предлагаю здесь, позволит вам сохранить ваши конкретные области в каждой области. Если ваш проект структурирован, как показано ниже, с блоком, являющимся областью.

+ Areas   <-- folder 
    + Blog   <-- folder 
    + Views  <-- folder 
     + Shared <-- folder 
     Index.aspx 
     Create.aspx 
     Edit.aspx 
+ Content 
+ Controllers 
... 
ViewEngine.cs 

Добавить этот код в метод Application_Start в Global.asax.cs. Он очистит ваши текущие механизмы просмотра и вместо этого использует наш новый ViewEngine.

// Area Aware View Engine 
ViewEngines.Engines.Clear(); 
ViewEngines.Engines.Add(new AreaViewEngine()); 

Затем создайте файл с именем ViewEngine.cs и добавьте код ниже.

using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.Linq; 
using System.Web.Mvc; 

namespace MyNamespace 
{ 

    public class AreaViewEngine : WebFormViewEngine 
    { 
     public AreaViewEngine() 
     { 
      // {0} = View name 
      // {1} = Controller name 

      // Master Page locations 
      MasterLocationFormats = new[] { "~/Views/{1}/{0}.master" 
              , "~/Views/Shared/{0}.master" 
              }; 

      // View locations 
      ViewLocationFormats = new[] { "~/Views/{1}/{0}.aspx" 
             , "~/Views/{1}/{0}.ascx" 
             , "~/Views/Shared/{0}.aspx" 
             , "~/Views/Shared/{0}.ascx" 
             , "~/Areas/{1}/Views/{0}.aspx" 
             , "~/Areas/{1}/Views/{0}.ascx" 
             , "~/Areas/{1}/Views/Shared/{0}.aspx" 
             , "~/Areas/{1}/Views/Shared/{0}.ascx" 
             }; 

      // Partial view locations 
      PartialViewLocationFormats = ViewLocationFormats; 

     } 

     protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) 
     { 
      return new WebFormView(partialPath, null); 
     } 

     protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) 
     { 
      return new WebFormView(viewPath, masterPath); 
     } 

    } // End Class AreaViewEngine 

}  // End Namespace  

Это найдет и воспользуется видами, которые вы создали в своих областях.

Это одно из возможных решений, позволяющее мне просматривать виды в указанной области. У кого-нибудь еще есть другое, лучшее, расширенное решение?

Благодаря

+0

Когда область добавления используется в папке «Области», она создает подпапку «Виды» в новой области.Вы уверены, что у вас что-то не хватает? –

+0

Вы правы, это создаст папку «Представления». Однако эти представления должны находиться в папке «Виды» основного проекта. См. Http://forums.asp.net/p/1494640/3540105.aspx, сначала ответьте на вопрос. – 37Stars

+0

+1 Ну, ваш подход звучит. На самом деле, я не могу себе представить, почему ребята MVC не просто включали дополнительные пути в основную сборку. Не имеет смысла. –

ответ

0

Это решение хорошо работает в Mvc2. Это не обязательно в Mvc3.

2

Я сожалею, чтобы быть один, чтобы сказать вам это, но вы должны быть что-то отсутствует. В настоящее время у меня есть сценарий, работающий из коробки с ASP.NET MVC 2 RC.

Я предполагаю, что у вас есть все пути регистрации и есть правильные файлы web.config в папке просмотра вашей области?

Возможно, посмотрите на this walk through, особенно на части создания областей.

HTHS,
Чарльз

EDIT: Хорошо, так что вы не счастливы о вводе в дополнительной new { area = "blog' }, null - достаточно справедливо, я признаю его niggly ... но что еще вы собираетесь делать?

Что происходит, когда у вас есть два контроллера с таким же именем? Один в вашем корневом проекте и один в области или двух контроллерах с тем же именем в двух разных областях? Как он найдет правильный взгляд?

Кроме того, я вижу проблему с вашим ViewLocationFormats. Во всех местах обзора области нет ссылки на их область ... например. ~/Areas/{1}/Views/{0}.ascx - как он знает, в какой области?

Если предположить, что все мнения разной площади и все бросили в папку Areas под их именем контроллера, а затем найти в Views и Views/Shared - я настоятельно рекомендовал бы против этого ... Это будет стать беспорядком очень быстро ,

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

+0

Чарльз, ты прав. Это решение будет работать. Однако, если вы реализуете это решение, указанное в вашей ссылке, вам нужно будет добавить область для каждого ActionLink. Решение, которое я показал, не требует добавления области к любой из ваших ссылок. Поэтому это становится вопросом предпочтения. Лично я не хотел добавлять ', new {area = ""}, null' к этим ссылкам к представлениям не в области. Спасибо за ваш ответ. Мне понравилось проходить упражнение. – 37Stars