Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC:将数据从操作筛选器传递到视图_C#_Asp.net_Asp.net Mvc_Session - Fatal编程技术网

C# ASP.NET MVC:将数据从操作筛选器传递到视图

C# ASP.NET MVC:将数据从操作筛选器传递到视图,c#,asp.net,asp.net-mvc,session,C#,Asp.net,Asp.net Mvc,Session,我已经创建了一个检查HTTP头的操作结果,如果返回了某个头值,那么我想在会话变量中存储一个布尔值。然后,我希望在局部视图中使用该会话变量,以确定是否应该显示某些HTML 如何将会话变量从操作筛选器传递到局部视图? 动作过滤器(位于BaseController.cs内部): 但是我一直从它那里得到一个NullReferenceException。然后我四处阅读,发现数据应该通过模型从控制器传递到视图,所以我做了如下操作: 单个控制器: public class ControllerModel :

我已经创建了一个检查HTTP头的操作结果,如果返回了某个头值,那么我想在会话变量中存储一个布尔值。然后,我希望在局部视图中使用该会话变量,以确定是否应该显示某些HTML

如何将会话变量从操作筛选器传递到局部视图?

动作过滤器(位于BaseController.cs内部):

但是我一直从它那里得到一个
NullReferenceException
。然后我四处阅读,发现数据应该通过模型从控制器传递到视图,所以我做了如下操作:

单个控制器:

public class ControllerModel : BaseControllerModel
{
    public bool Authorized { get; set; }
}

public ActionResult Authorized()
{
    ControllerModel model = new ControllerModel();
    model.Authorized = (bool)HttpContext.Session["authorized"];
    return View(model);
}
现在,Session变量在那里,但它总是返回false(我假设它只是返回默认值)

在这一点上,我看到两个问题:

  • 我正在两个不同的位置创建一个单独的会话变量,即基本控制器和每个单独的控制器。部分视图正在从单个控制器中提取数据,因此如何让部分视图从基本控制器中提取数据

  • 如果我应该首先将数据传递给模型,我是否应该在BaseController内部创建一个action方法并使用BaseControllerModel(见下文)?这听起来是一个糟糕的想法,但我想以某种方式创建一个通用方法,该方法将适用于所有控制器,因为每个视图中都存在局部视图

  • 在基本控制器中:

    public ActionResult Authorized()
    {
        BaseControllerModel model = new BaseControllerModel();
        model.Authorized = (bool)HttpContext.Items["authorized"];
        return View(model);
    }
    
    在基本控制器模型中:

    public bool Authorized { get; set; }
    

    可能会这样应用过滤器:

    [AuthorizationFilter]
    public ActionResult Authorized()
    {
        ControllerModel model = new ControllerModel();
        model.Authorized = (bool)HttpContext.Session["authorized"];
        return View(model);
    }
    

    当authorized为true时,您永远不会存储到会话

    if (response.Headers["key"] == "1")
    {
          authorized = false;
          filterContext.HttpContext.Session["authorized"] = authorized;
    
          filterContext.Result = new RedirectResult("https://www.website.com");
    } else {
          filterContext.HttpContext.Session["authorized"] = authorized;
    }               
    

    我相信我找到了答案。我的问题是,我试图访问Authorize()方法中的会话变量,但由于索引页中包含了我的部分视图,因此我应该将会话变量存储在index()方法中

    因此,我的两个更改是将会话变量添加到每个控制器内的index()方法中,并将授权过滤器添加到该方法中,以确保该方法被调用

        [AuthorizationFilter]
        public ActionResult Index()
        {
            model.Authorized = (bool)HttpContext.Session["authorized"];
            return View(model);
        }
    
    然后,正如B2K所说,我还在我的操作过滤器中添加了一个else语句,以确保还存储了一个true值

        else
        {
            filterContext.HttpContext.Session["authorized"] = authorized;
        }
    
    真正有效的选项) 问题是过滤器无法访问视图数据视图包临时数据。 但是,可以访问context.HttpContext.Items[] 例如:

    在过滤器中:

    context.HttpContext.Items["MyObject"] = new MyObject
    
    鉴于:

    @{ MyObject obj = (MyObject)Context.Items["MyObject"]; }
    

    如果删除authorized=false,会话变量是否仍然为false?@scheien Yes。还是假的。我认为缺少的是,我没有将基本控制器动作过滤器与每个单独控制器中的动作方法连接起来。也许?我想你需要用过滤器来修饰适当的方法是的。@scheien你能告诉我怎么做吗?如果你一步一步地看代码,它甚至可以访问过滤器吗?是的,它可以。我的代码中没有包含这一点,但我在过滤器中循环了HTTP头和输出到输出窗口。每次访问视图时,我都会看到HTTP头。实际上,如果我只在Authorize()方法中包含筛选器,那么它就不会到达筛选器。我需要在整个控制器类中包含过滤器,以便达到过滤器。这一点很好。我在else语句中添加了。不幸的是,它仍然没有返回真值。。。
        else
        {
            filterContext.HttpContext.Session["authorized"] = authorized;
        }
    
    context.HttpContext.Items["MyObject"] = new MyObject
    
    @{ MyObject obj = (MyObject)Context.Items["MyObject"]; }