2012-12-31 60 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 
} 
相关问题