Перенаправить на контроллер (но с другим мастером), используя подстановочный знак

StackOverflow https://stackoverflow.com/questions/237440

Вопрос

У меня есть проблема, из-за которой я хочу отображать представление по-разному (другую главную страницу), в зависимости от того, откуда оно появилось, но не знаю, с чего начать ...

У меня есть несколько маршрутов, которые перехватывают разные типы URL, которые содержат разные структуры.

В приведенном ниже фрагменте кода у меня есть маршрут продукта, а затем у меня есть маршрут сайта партнера, который также может перейти на страницу продукта, но давайте предположим, что этот партнер - Pepsi, и они хотят, чтобы их брендирование было на главной странице. , а не наш собственный стиль по умолчанию. Допустим, я захожу в products / cola.htm . Это должен быть тот же URL-адрес, что и partners / pepsi / products / cola.htm и PartnerRedirect сможет обрабатывать URL-адрес на основе подстановочного знака, переводя подстановочный знак URL-адреса (в данном случае «products / cola.htm») в действие контроллера и перенаправляя пользователя (но просто изменить главную страницу в представлении).

routes.MapRoute(
    "Product",
    "products/{product}.htm",
    new { controller = "Product", action = "ShowProduct" }
);

routes.MapRoute(
    "ProductReview",
    "products/{product}/reviews.htm",
    new { controller = "Product", action = "ShowProductReview" }
);

routes.MapRoute(
    "Partner",
    "partners/{partner}/{*wildcard}",
    new { controller = "Partners", action = "PartnerRedirect" }
);

Возможно ли это? И если да, то как?

Заранее большое спасибо.

Это было полезно?

Решение

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

Я не знаю, ищите ли вы это, но это может быть вариант.

Другие советы

У меня была та же проблема

public class FriViewPage : ViewPage
{
    public override string MasterPageFile
    {
        get
        {
            return "~/Views/Shared/Site.Master"; // base.MasterPageFile;
        }
        set
        {
            if (ViewData["agent"].ToString() == "steve")
                base.MasterPageFile = "~/Views/Shared/Site.Master";
            else
                base.MasterPageFile = "~/Views/Shared/Site2.Master";
        }
    }
}

Тогда просто убедитесь, что все представления наследуются от FriViewPage вместо ViewPage

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

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

Возможно, стоит задать еще один вопрос.

На самом деле метод получения MasterPageFile никогда не вызывается

Вы можете изменить MasterPage, изменив ViewResult перед рендерингом. Например, действие контроллера может выполнить:

public ActionResult TestMP(int? id)
{
    ViewData["Title"] = "MasterPage Test Page";
    ViewData["Message"] = "Welcome to ASP.NET MVC!";
    ViewResult result = View("Index");
    if (id.HasValue)
    {
        result.MasterName = "Site2";
    }
    return result;
}

Вы можете сделать то же самое с помощью фильтра действий для более общего решения.

scroll top