Один контроллер с несколькими представлениями - PullRequest
1 голос
/ 05 марта 2009

Я пытаюсь создать приложение 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()); 
    }

Затем я спустился с WebFormViewEngine и изменил путь с ~ / View на ~ / {mode} 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);
    }
}

Ответы [ 3 ]

1 голос
/ 06 марта 2009

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

0 голосов
/ 05 марта 2009

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

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

0 голосов
/ 05 марта 2009

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

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

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