2012-12-31 57 views
1

在我的ASP.netMVC 3(基於nopcommerce的)應用程序中,我需要確保用戶從列表中選擇他的位置,並將此選擇存儲在會話中以進行動態價格計算。因爲可能會有多個入口點(主頁,搜索結果,來自Google索引頁面等),我想確保一旦他嘗試查看任何產品時,位置選擇(可能是彈出窗口)就會呈現給用戶可能有價格的頁面。對於給定的會話,這必須是一次性選擇。強制用戶在應用程序啓動時作出選擇

如果特定的會話變量存在,什麼是最好的事件處理程序(Application_BeginRequest ??)來執行檢查?

回答

4

如果該位置尚未存儲,則可以使用操作篩選器檢查會話中的值並重定向到視圖。一旦被捕獲,您可以重定向回原始視圖。

是這樣的:任何需要的地方在一個控制器/動作

public class CheckLocationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var location = filterContext.HttpContext.Session["Location"]; 

     if (string.IsNullOrWhiteSpace(location)) 
     { 
      // store the requested URL for use once location has been chosen 
      filterContext.Controller.TempData["ReturnToUrl"] = filterContext.HttpContext.Request.Url; 

      // redirect to location choice view 
      filterContext.Result = new RedirectResult(VirtualPathUtility.ToAbsolute("~/Location/Choose")); 
     } 
    } 
} 

然後使用這個屬性:

public class SomeController : Controller 
{ 
    [CheckLocation] 
    public ActionResult Index() 
    { 
     // location has been checked so continue 

     return View(); 
    } 
} 
0

您可以使用動作過濾器在全球範圍內檢查會話變量。但是,如果您想在不重定向的情況下在特定頁面上顯示選擇用戶界面,則最好使用支持它的操作(例如Html.RenderAction())的部分視圖。

在任何視圖中調用RenderAction助手,以便向用戶顯示此選擇UI。該操作將檢查會話變量。根據會話變量是否存在,爲動作設置一些模型值並將其部分設置爲真/假。然後對該模型值進行局部視圖檢查並相應地顯示選擇UI(即,如果該值指示用戶需要進行選擇,則顯示彈出框)。

+0

這意味着該位置選擇視圖將呈現(冗餘)多次。如果有關聯的數據庫查詢(檢索位置列表),這也會增加開銷。 – MarkG

+0

另外,可以應用操作過濾器來查看操作或控制器或全局。 – MarkG

+0

視圖將有機會渲染很多次,是的。但是,它會檢查模型值,看它是否真的需要顯示選擇UI。此外,除非Session變量不存在,否則不會有數據庫命中。例如,檢查Session var,如果不存在,則敲入DB,存儲在Session中,返回模型。如果Session var存在,只需設置模型值並返回;沒有數據庫命中。 – ventaur

0

在你的控制器的動作,你可以檢查:

if(HttpContext.Current.Session["Shown"] == null){ 
    HttpContext.Current.Session["Shown"] = true; 
    // turn on a flag for client to know it should show popup 
} 
相關問題