2011-07-30 78 views
0

首先,我看到了這個問題:ASP.NET MVC one route, two different views但它並不回答我的確切問題。如何在ASP.NET MVC中使用相同的路徑創建兩個視圖?

我想有一個圖,但具體取決於您是否已經登錄同一網址/路由

我想它,所以如果一個用戶進入: mydomain.com那麼他們要麼是帶到營銷登陸頁面,或者他們將被帶到用戶登錄的儀表板。

我上面貼的問題表明,我應該使用:

if (Request.IsAuthenticated) { 
    return View("Dashboard"); 
} else { 
    return View("Index"); 
} 

然而,我的觀點一個要求,我通過他們的特定動作,因爲它需要的行動提供視圖模型數據。

現在,如果我這樣做:

if (Request.IsAuthenticated) { 
    return RedirectToAction("Index", "Dashboard"); 
} else { 
    return View("Index"); 
} 

這工作,但重定向會導致用戶的網址是儀表板指數作用,這是mydomain.com/dashboard的路線。

我怎樣才能通過操作並仍然保持我的域的根網址?

回答

0

你要填充模型數據在當前的行動

if (Request.IsAuthenticated) { 
    // populate your model to send it to the Dashboard. 
    // to keep it DRY, you'll want to use a data service. 
    var model = DataService.GetData(); 
    return View("Dashboard", model); 
} else { 
    return View("Index"); 
} 
+0

然後我有代碼重複。這些是在兩個不同的控制器(「儀表板」vs「着陸」)和儀表板控制器有很多的存儲庫,沒有真正有意義的着陸控制器。 –

+0

我可能是錯的,但這是唯一可以考慮維護url並仍然檢索模型的方法。另一種(未經測試)的方式可能會在「儀表板」視圖中的代碼塊中進行模型檢索,但我不建議這樣做,因爲您「應該」保持視圖精簡。 –

+0

爲什麼你不能建立一個完成所有繁重工作的服務,然後在'LandingPage'動作和'Dashboard'動作中使用該服務? –

0

我知道這是不是你想要的是什麼,但它導致儀表盤正對域的根和登錄重定向到改爲另一個網址。而當你認爲你可能會想在把它這種功能對於每一個「授權」頁面if語句看起來像一個痛苦的方式去了解它:

在web.config中

<authentication mode="Forms"> 
    <forms loginUrl="~/Login" timeout="15" slidingExpiration="true" /> 
</authentication> 

然後裝飾控制器:

[Authorize] 
    public ActionResult Index() 
    { 
     return View(); 
    } 


    [Authorize(Roles="SysAdmin")] 
    public ActionResult ManageUsers() 
    { 
     return View(); 
    } 
0

這是我認爲可以幫助你的快速構思。 我還沒有深入測試過

情況看起來類似於具有相同的動作,並使用[HttpGet]或[HttpPost]動作方法選擇器屬性對它們進行裝飾。如果與帖子相匹配,則優先執行帖子後的操作,否則獲得。 我將適用同樣的邏輯,使用自定義路由約束

首先創建約束類

public class IsAuthenticatedRouteConstraint : IRouteConstraint 
    { 
     public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
     { 
      return httpContext.Request.IsAuthenticated; 
     } 
    } 

然後,在Global.asax中,註冊兩條路線。第一個優先級較高,並且具有已驗證的約束,因此在用戶登錄時匹配。否則第二個。通過給出正確的默認值,我認爲你可以得到理想的結果。

routes.MapRoute(
       "DefaultAuthenticated", 
       "{controller}/{action}/{id}", 
       new { controller = "Default", action = "Dashboard", id = UrlParameter.Optional }, 
       new { isAuthenticated = new IsAuthenticatedRouteConstraint()} 
      ); 

      routes.MapRoute(
       "Default", //Matches if not authenticated 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "Default", action = "Index", id = UrlParameter.Optional } 
      ); 

P.S這可能仍然需要更多配置。希望的想法有幫助

相關問題