Перенаправить на контроллер (но с другим мастером), используя подстановочный знак
-
04-07-2019 - |
Вопрос
У меня есть проблема, из-за которой я хочу отображать представление по-разному (другую главную страницу), в зависимости от того, откуда оно появилось, но не знаю, с чего начать ...
У меня есть несколько маршрутов, которые перехватывают разные типы 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;
}
Вы можете сделать то же самое с помощью фильтра действий для более общего решения.