Не удается разрешить представление родительского контроллера - PullRequest
1 голос
/ 21 октября 2010

Создать контроллер:

public abstract class MyBaseController : Controller
{
   public ActionResult MyAction(string id)
   {
      return View();
   }
}

Чем создать еще один конкретный контроллер, унаследованный от MyBaseController:

public class MyController : MyBaseController 
{

}

В папке Views / MyBaseController есть представление MyAction.aspx. Затем вызовите метод MyController / MyAction. Будет сгенерировано следующее исключение:

Представление «MyAction» или его мастер невозможно найти. Следующие места были найдены: ~ / Views / MyController / MyAction.aspx ~ / Views / MyController / MyAction.ascx ~ / Views / Shared / MyAction.aspx ~ / Views / Shared / MyAction.ascx

Можно ли заставить MVC.NET использовать представление из папки Views / MyBaseController?

Ответы [ 3 ]

3 голосов
/ 21 октября 2010

вам следует дождаться более тонкого ответа, но эта работа:

Создайте новый механизм просмотра на основе по умолчанию и переопределите FindViewMethod следующим образом:


 public class MyNewViewEngine : WebFormViewEngine
 {
     public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
     {
        var type = controllerContext.Controller.GetType();

            //Retrieve all the applicable views.
            var applicableViews = from m in type.GetMethods()
                                  where typeof(ActionResult).IsAssignableFrom(m.ReturnType) & m.Name == viewName
                                  select m;

            //Save the original location formats.
            var cacheLocations = ViewLocationFormats;
            var tempLocations = cacheLocations.ToList();

            //Iterate over applicable views and check if they have been declared in the given controller.
            foreach(var view in applicableViews)
            {
                //If not, add a new format location to the ones at the default engine.
                if (view.DeclaringType != type)
                {
                    var newLocation = "~/Views/" + view.DeclaringType.Name.Substring(0, view.DeclaringType.Name.LastIndexOf("Controller")) + "/{0}.aspx";
                    if (!tempLocations.Contains(newLocation))
                        tempLocations.Add(newLocation);
                }
            }

            //Change the location formats.
            ViewLocationFormats = tempLocations.ToArray();

            //Redirected to the default implementation
            var result = base.FindView(controllerContext, viewName, masterName, useCache);

            //Restore the location formats
            ViewLocationFormats = cacheLocations;

            return result;
   }
}

Добавьте новыйпросмотр движка:


 public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            ViewEngines.Engines.Clear();
            ViewEngines.Engines.Add(new MyNewViewEngine());
            RegisterRoutes(RouteTable.Routes);
        }
    }

надеюсь, это поможет

0 голосов
/ 21 октября 2010

Можно, но не очень чисто.

public class MyController : MyBaseController 
{
   public ActionResult MyAction(string id)
   {
       return View("~/Views/MyBaseController/MyAction.aspx");
   }
}

Однако, если ваше представление (MyAction.aspx) содержит ссылку на частичное представление, ASP.NET MVC будет искать его в папке Views / MyController (а не там!).

Если ваше представление используется несколькими контроллерами, лучше всего поместить его в папку Views/Shared в соответствии с рекомендациями NickLarsen.

0 голосов
/ 21 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...