2

我正在开发一个分为年度会议的系统。用户可以去更改会话以查看过去的会话

我将如何将用户当前传递yearId给每个控制器?

我在想我可以在身份验证时设置用户cookie,或者当他们手动更改会话并使用全局过滤器检查cookie时

public class MyTestAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpCookie cookie = filterContext.HttpContext.Request.Cookies["myCookie"];

        //do something with cookie.Value
        if (cookie!=null) 
        {
           filterContext.ActionParameters["YearId"] = cookie.Value;
        }
        else
        {
           // do something here
        }
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
    }
}

以下是我如何使用上述过滤器:(或将其添加为全局过滤器)

[MyTestAttribute]
public ActionResult Index(int yearId)
{
    //Pass the yearId down the layers
    // _repo.GetData(yearId);
    return View();
}

使用这种方法,我必须将 yearId 添加到每个控制器。任何反馈表示赞赏。

4

2 回答 2

1

您还可以为需要参数而不是过滤器的控制器创建一个基类:

public class MyBaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpCookie cookie = filterContext.HttpContext.Request.Cookies["myCookie"];

        //do something with cookie.Value
        if (cookie!=null) 
        {
           filterContext.ActionParameters["YearId"] = cookie.Value;
        }
        else
        {
           // do something here
        }
    }
}

或者您甚至可以创建一个强类型属性并使其变得惰性,这样您就不必将它作为参数包含在每个操作方法中,并且除非您访问该属性,否则不要执行评估:

public class MyBaseController : Controller
{
    private int? _yearId;

    protected int YearId
    {
        get
        {
             // Only evaluate the first time the property is called
             if (!_yearId.HasValue)
             {
                 // HttpContext is accessible directly off of Controller
                 HttpCookie cookie = HttpContext.Request.Cookies["myCookie"];

                 //do something with cookie.Value
                 if (cookie!=null) 
                 {
                      _yearId = int.Parse(cookie.Value);
                 }
                 else
                 {
                      // do something here
                 }
             }

             return _yearId.Value;
        }
    }
}
于 2013-01-25T15:47:56.983 回答
0

这开销太大了。

为什么不把值放在会话中?如果他们更改“会话”以查看过去的会话,只需修改会话中的变量。

于 2013-01-25T14:42:38.743 回答