我有一个问题,我想以不同的方式显示视图(不同的母版页),具体取决于它来自哪里,但不知道从哪里开始......
我有几条路线可以捕获包含不同结构的各种不同类型的网址。
在下面的代码片段中,我有一个产品路线,然后我有一个合作伙伴网站路线,也可以转到产品页面,但是假设这个合作伙伴是百事可乐,他们想在主页面上打造品牌而不是我们自己的默认样式。让我们说我去products/cola.htm。这应该转到与partners/pepsi/products/cola.htm相同的URL,并且PartnerRedirect将能够通过将URL通配符(在本例中为“products / cola.htm”)转换为控制器来处理基于通配符的URL操作,并转发用户,(但只需更改视图中的母版页)。
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" }
);
这可能吗?如果是这样,怎么样?
非常感谢提前。
答案 0 :(得分:1)
在您的合作伙伴控制器中,为什么不设置一个cookie来指示您要显示哪个合作伙伴,然后重定向到路径的通配符部分。这样,您可以为所有后续页面视图显示相同的合作伙伴布局。
我不知道这是否是您正在寻找的,但它可能是一种选择。
答案 1 :(得分:1)
我有同样的问题
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
答案 2 :(得分:0)
可能是恶魔的工作,但您可以在Partner View的代码隐藏中放置一些代码来查看URL,然后在那里以编程方式设置母版页?
答案 3 :(得分:0)
我不确定如何以编程方式改变母版页,因为我从未这样做过,但我确信它是可能的(它可能只是页面上的一个属性)。
这可能值得问另一个问题。
答案 4 :(得分:0)
实际上MasterPageFile getter似乎永远不会被称为
答案 5 :(得分:0)
您可以在渲染之前修改ViewResult来更改MasterPage。例如,控制器操作可以执行:
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;
}
您可以使用动作过滤器完成相同的操作,以获得更通用的解决方案。