2011-12-05 19 views
0

ASP.NET MVCイントラネットアプリケーションには、現在のユーザーのWindowsログインを使用してユーザーのデフォルトホームサイトに属するデータを取得するデータリポジトリがあります。ログインにはサイト識別子が含まれています。リポジトリクラスは、HttpContext.Current.User.Identityにアクセスし、ログインからサイトIDを抽出する唯一の場所です。したがって、アプリケーションは1つのユーザーサイトのデータのみを処理します。ユーザーがサイトメニューから別のサイト名のリンクをクリックすると、他のサイトのデータを表示できるようになりました。サイトメニューはマスターページにあります。ユーザーが任意のサイトリンクをクリックすると、サイトスコープを更新してから、そのサイトリンクが新しいサイトスコープでクリックされる前に実行されたアクションを再実行する必要があります。たとえば、ユーザーがリクエストリストを実行すると、デフォルトではユーザーのデフォルトサイトからのリクエストのみが表示されます。ユーザーが別のサイトをクリックすると、サイトの要求が表示されます。アプリには多くのコントローラーアクションがありますが、私は各コ​​ントローラーと既存のルートの各アクションを変更しないことをお勧めします。サイトスコープを設定するアクションで新しいコントローラを作成することを考えていますが、新しいコントローラのアクションが実行される前にどのアクションが実行されたかを認識させる方法はわかりません。スコープの変更を維持するためにSession変数を使用する必要がありますか?アクションフィルタは私のアプリを再因子化する良い方法ですか?コードサンプルの提案は感謝しています。ありがとうございました。コントローラのアクション履歴

答えて

0

セッション変数を作成してリダイレクトを実行するアクションで新しいコントローラを作成しました。リポジトリでは、セッション変数がチェックされ、ユーザーのホームサイトと同じであるかどうかが確認されます。セッション変数の値が異なる場合は、セッション変数の値が戻り値になります。 SiteController.Index()のIndex.aspxはUserControlを返します。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<VETS.Models.Site>>" %> 
<ul id="menu"> 
    <% foreach (var item in Model) 
     { %> 

    <li><%: Html.ActionLink(item.SiteName, "SetSiteScope", new { siteID = item.SiteID })%></li> 
    <% 
     } %> 
</ul> 

public class SiteController : Controller 
{ 
    public ActionResult SetSiteScope(short siteID) 
    { 
     HttpContext.Session.Add("CurrentSiteID",siteID); 
     //var routeData = ControllerContext.RouteData; 
     //routeData.Route.ToString(); 
     //var actionName = ControllerContext.RouteData.GetRequiredString("action"); 
     //return RedirectToAction(actionName, "Transfers"); 
     Uri prevURL = HttpContext.Request.UrlReferrer; 
     return Redirect(prevURL.ToString()); 
    } 
} 

public class vRepository : IvRepository 
{ 
    public Site CurrentSite() 
    { 

     if (HttpContext.Current.Session != null && HttpContext.Current.Session["CurrentSiteID"] != null) 
     { 
     targetSiteID = short.Parse(HttpContext.Current.Session["CurrentSiteID"].ToString()); 
     targetSite = SiteList().Single(s => s.SiteID == targetSiteID); 
     } 
     return targetSite; 
    } 
}