2009-03-05 8 views
1

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

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

     routes.MapRoute(
      "xml",            // Route name 
      "xml/{controller}/{action}/{id}",       // URL with parameters 
      new { mode = "xml", controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 
    } 
    protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 
     SessionManager.Instance.InitSessionFactory("acstech.helpWanted"); 
     ViewEngines.Engines.Clear(); 
     ViewEngines.Engines.Add(new ModeViewEngine()); 
    } 

I следует, что, спускаясь из WebFormViewEngine и изменил путь от ~/View в ~/{режим} View. Это сработало и запустило правильные страницы. Проблема, с которой я столкнулся, заключается в том, что Html.ActionLink всегда использует версию режима независимо от того, что отображалось в представлении. Это правильное направление для достижения моей цели, если да, то чего мне не хватает, чтобы заставить Action Link работать правильно. Ниже представлен ViewEngine. Это лабораторный тест, поэтому некоторые свободы были приняты.

public class ModeViewEngine : WebFormViewEngine 
{ 
    public ModeViewEngine() 
    { 

    } 

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) 
    { 
     string mode = String.Empty; 
     if (controllerContext.RouteData.Values["mode"] != null) 
      mode = controllerContext.RouteData.Values["mode"] as string; 
     return new WebFormView(partialPath.Replace("~/Views", "~/" + mode + "Views"), null); 
    } 

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) 
    { 
     string mode = String.Empty; 
     if (controllerContext.RouteData.Values["mode"] != null) 
      mode = controllerContext.RouteData.Values["mode"] as string; 
     return new WebFormView(viewPath.Replace("~/Views", "~/" + mode + "Views"), masterPath); 
    } 
} 

ответ

0

Почему бы вам не настроить ваш контроллер только в зависимости от режима? Затем вы можете вернуть свой домашний вид или Home_Xml.

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

+0

Это будет работать, и я мог бы централизовать представление, создав базовый ApplicationController, но желание состоит в том, чтобы иметь две отдельные структуры представления. – Thad

0

Хорошо, что дело в структуре Asp.Net - это то, что является очень расширяемым. Я думаю, вы должны проверить эту ссылку. Это будет именно то, что вы ищете. Мой комментарий, наряду с авторами, - создать ActionFilter и украсить ваши представления в контроллере, нуждающемся в XML или даже в представлениях JSON. Я даже видел случаи, когда вся сериализация в XML происходит в Фильтре и возвращается, поэтому не требуется ViewEngine.

http://jesschadwick.blogspot.com/2008/06/aspnet-mvc-using-custom-view-engines.html

1

Вы пробовали режим добавления = «» в массиве значений по умолчанию в маршруте по умолчанию? То есть, как я понимаю, как действие «Индекс» исключается из URL-адресов, поэтому теоретически это будет соответствовать вашему стандарту по умолчанию, на который я верю.

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