代码之家  ›  专栏  ›  技术社区  ›  Dan Atkinson

使用CatchAll通配符重定向到控制器(但使用其他主控形状)

  •  3
  • Dan Atkinson  · 技术社区  · 16 年前

    我有一个问题,我想显示不同的视图(不同的母版页),这取决于它来自哪里,但不知道从哪里开始…

    我有几个路由可以捕获包含不同结构的各种不同类型的URL。

    在下面的代码片段中,我有一个产品路线,然后我有一个合作伙伴站点路线,它也可以转到产品页面,但是假设这个合作伙伴是百事可乐,他们希望他们的品牌在主页上,而不是我们自己的默认样式。假设我去 products/cola.htm . 应该转到与 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 回复  |  直到 16 年前
        1
  •  1
  •   jonnii    16 年前

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

    我不知道这是不是你要找的,但这可能是一个选择。

        2
  •  1
  •       16 年前

    我也有同样的问题

    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";
            }
        }
    }
    

    然后确保所有视图都继承自friewpage而不是viewpage

        3
  •  0
  •   jmcd    16 年前

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

        4
  •  0
  •   jonnii    16 年前

    我不知道你如何通过编程改变主页面,因为我从来没有这样做过,但我相信这是可能的(它可能只是一个页面上的属性)。

    这可能是另一个值得问的问题。

        5
  •  0
  •       16 年前

    准确地说,masterpagefile getter似乎从未被调用

        6
  •  0
  •   Matthew    16 年前

    可以通过在渲染之前修改视图结果来更改母版页。例如,控制器操作可以执行以下操作:

    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;
    }
    

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