强制用户在应用程序启动时进行选择

时间:2012-12-31 06:34:49

标签: asp.net asp.net-mvc

在我的ASP.net MVC 3(基于nopcommerce)应用程序中,我需要确保用户从列表中选择他的位置,并将此选择存储在会话中以进行动态价格计算。因为,可能有多个入口点(主页,搜索结果,来自Google索引页面等)我想确保一旦他试图查看任何产品,就会向用户显示位置选择(可能是弹出窗口)可能有价格的页面。对于给定的会话,这必须是一次性选择。

如果特定会话变量存在,执行检查的最佳事件处理程序(Application_BeginRequest ??)是什么?

3 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:0)

您可以使用操作过滤器全局检查会话变量。但是,如果要在某些页面上显示选择UI而不重定向,则最好使用部分视图并对其进行操作(例如,Html.RenderAction())。

在要使用此选择UI向用户显示的任何视图中调用RenderAction帮助器。该操作将检查会话变量。根据会话变量是否存在,为操作设置一些模型值,并将其设置为true / false。然后检查该模型值的部分视图并相应地显示选择UI(即,如果值指示用户需要进行选择,则显示弹出窗口。)

答案 2 :(得分:0)

在您的控制器操作中,您可以查看:

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