Решение для сохранения представлений в областях с одним проектом - PullRequest
4 голосов
/ 03 февраля 2010

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

Поддержка области была добавлена ​​в 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    

Это позволит найти и использовать созданные вами виды в ваших регионах.

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 03 февраля 2010

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

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

Может быть, посмотрите на эту прогулку по , особенно часть о создании областей.

HTHS
Charles

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

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

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

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

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

0 голосов
/ 08 июля 2011

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

...