Перенаправить на контроллер (но с другим мастером), используя подстановочный знак - PullRequest
3 голосов
/ 26 октября 2008

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

У меня есть несколько маршрутов, которые перехватывают различные типы 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" }
);

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

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

Ответы [ 6 ]

1 голос
/ 12 декабря 2008

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

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

1 голос
/ 27 октября 2008

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

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

0 голосов
/ 13 декабря 2008

Вы можете изменить 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;
}

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

0 голосов
/ 12 декабря 2008

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

0 голосов
/ 27 октября 2008

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

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

0 голосов
/ 27 октября 2008

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

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