2011-07-30 45 views
0

私はこの質問を見ました:ASP.NET MVC one route, two different viewsしかし、私の正確な質問には答えません。ASP.NET MVCで同じルートで2つのビューを表示するにはどうすればよいですか?

私は1つのビューを持ちたいが、あなたがログインしているかどうかに応じて、同じURL /ルートと

私はそれをしたいユーザーは、に行くので、もし

:。 mydomain.comその後、彼らはどちらかになりますマーケティングランディングページに移動するか、ユーザーがログインしたダッシュボードに移動します。

私は上記の投稿の質問は、私が使用する必要があることを示唆している:

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

しかし、私の意見の一つは、それは、アクションが提供するビューモデルのデータを必要とするため、私は彼らの特定のアクションを経ることが必要です。私はこれを行う場合

は今、:

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

をこれは動作しますが、リダイレクトは、ユーザーのURLがmydomain.com/dashboardされたダッシュボード-indexアクションのための経路であると発生します。

私はアクションを実行しても、自分のドメインのルートURLを維持できますか?

答えて

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

私はコードの複製をしています。これらは2つの異なるコントローラー(「Dashboard」と「Landing」)にあり、ダッシュボードコントローラーには、着陸コントローラーにはあまり意味を持たない多くのリポジトリーがあります。 –

+0

私は間違っているかもしれませんが、URLを維持してモデルを引き出すために私が考えることができる唯一の方法です。別の(テストされていない)方法は、 "ダッシュボード"ビューのコードブロック内でモデルを取得することですが、これはお勧めしませんが、ビューをリーンに保つ必要があるためです。 –

+0

重労働をしているサービスを構築して、 'LandingPage'アクションと' Dashboard'アクションの両方でそのサービスを使用することができないのはなぜですか? –

0

でモデルデータを移入することをお勧めします代わりに別のURL。そして、あなたはおそらく、すべての「認定」ページのため、この機能は、文はそれについて移動する痛みを伴う方法のように見える場合にそれを入れたいと思うことを考えると: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]アクションメソッドセレクタ属性とそれらを飾るようになります。投稿とのマッチがある場合は、それが優先され、投稿の下のアクションが実行され、そうでない場合は取得されます。 私は2つのルートを登録し、Global.asaxの中で、最初に続いて、制約クラス

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

を作成したカスタムルート制約

を使用して同じロジックを適用します。最初の方が優先度が高く、認証された制約があるため、ユーザーがログオンしているときに一致します。もう1つ。正しいデフォルト値を与えることで、私はあなたが望む結果を得ることができたと思います。

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.これにはさらに構成が必要な場合があります。希望のアイディアが役に立ちます

関連する問題