C# ASP.NET MVC:将数据从操作筛选器传递到视图
我已经创建了一个检查HTTP头的操作结果,如果返回了某个头值,那么我想在会话变量中存储一个布尔值。然后,我希望在局部视图中使用该会话变量,以确定是否应该显示某些HTML 如何将会话变量从操作筛选器传递到局部视图? 动作过滤器(位于BaseController.cs内部): 但是我一直从它那里得到一个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 :
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(我假设它只是返回默认值)
在这一点上,我看到两个问题:
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"]; }