2008-10-26 39 views
3

我有一個問題,我希望以不同的方式顯示視圖(不同的母版頁),具體取決於它來自哪裏,但不知道在哪裏開始...使用通配符重定向到控制器(但使用不同的主控制器)

我有幾條路線,它們會捕獲包含不同結構的各種不同類型的網址。

在下面的代碼片段中,我有一個產品路線,然後我有一個合作伙伴網站路線,也可以轉到產品頁面,但讓我們說這個合作伙伴是百事可樂,他們希望他們的品牌頁面,而不是我們自己的默認樣式。可以說我去products/cola.htm。這應該與partners/pepsi/products/cola.htm的URL相同,並且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" } 
); 

這可能嗎?如果是這樣,怎麼樣?

非常感謝提前。

回答

1

在您的合作伙伴控制器中,爲什麼不設置一個cookie來指示要顯示哪個合作伙伴,然後重定向到路徑的通配符部分。這樣,您可以爲所有後續頁面查看顯示相同的合作伙伴佈局。

我不知道這是你在找什麼,但它可能是一個選項。

0

它可能是惡魔的工作,但你可以在合作伙伴視圖的隱藏代碼中放一些代碼來查看URL,然後在那裏以編程方式設置母版頁?

0

我不知道如何以編程方式更改母版頁,因爲我從來沒有這樣做過,但我確信這是可能的(它可能只是頁面上的一個屬性)。

這可能值得作爲另一個問題提出。

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

0

NOTE:事實上在的MasterPageFile吸氣永遠不會出現被稱爲

0

您可以通過更改母版繼承在渲染之前修改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; 
} 

您可以使用更通用的解決方案的動作過濾器完成同樣的事情。

相關問題