3

我有一个问题,我想以不同的方式显示视图(不同的母版页),具体取决于它的来源,但不知道从哪里开始......

我有几条路线可以捕获包含不同结构的各种不同类型的 url。

在下面的代码片段中,我有一个产品路线,然后我有一个合作伙伴站点路线,它也可以转到产品页面,但是假设这个合作伙伴是百事可乐,他们希望他们的品牌在母版页上,而不是我们自己的默认样式。假设我去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" }
);

这可能吗?如果是这样,怎么办?

提前谢谢了。

4

6 回答 6

1

在您的合作伙伴控制器中,您为什么不设置一个 cookie 来指示您要显示哪个合作伙伴,然后重定向到路由的通配符部分。这样,您可以为所有后续页面视图显示相同的合作伙伴布局。

我不知道这是否是您正在寻找的,但它可能是一种选择。

于 2008-10-27T03:42:26.943 回答
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

于 2008-12-12T10:33:43.963 回答
0

这可能是魔鬼的工作,但您可以在合作伙伴视图的代码隐藏中放置一些代码来查看 URL,然后以编程方式在其中设置母版页?

于 2008-10-27T08:57:40.707 回答
0

我不确定如何以编程方式更改母版页,因为我从未这样做过,但我确信这是可能的(它可能只是 Page 上的一个属性)。

这可能值得作为另一个问题提出。

于 2008-10-27T14:15:24.420 回答
0

Acutally MasterPageFile getter 似乎永远不会被调用

于 2008-12-12T10:35:06.817 回答
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;
}

您可以使用操作过滤器来完成同样的事情,以获得更通用的解决方案。

于 2008-12-13T02:49:51.377 回答