C# 在MVC上使用操作过滤器#使用查询字符串

C# 在MVC上使用操作过滤器#使用查询字符串,c#,asp.net-mvc,action-filter,actionfilterattribute,C#,Asp.net Mvc,Action Filter,Actionfilterattribute,我正在使用类名RightCheckerAttribute检查MVC3应用程序中的用户权限。。。 所以RightCheckerAttribute类是这样的 public bool isAdmin { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext) { HttpContextBase context = filterContext

我正在使用类名RightCheckerAttribute检查MVC3应用程序中的用户权限。。。 所以RightCheckerAttribute类是这样的

    public bool isAdmin { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContextBase context = filterContext.HttpContext;

        bool result = Convert.ToBoolean(context.Request.QueryString["isAdmin"].ToString());

        if (isAdmin != result) 
        {
            RouteValueDictionary redirecttargetDictionary = new RouteValueDictionary();
            redirecttargetDictionary.Add("action", "NoPermission");
            redirecttargetDictionary.Add("controller","Singer");
            filterContext.Result = new RedirectToRouteResult(redirecttargetDictionary);

        }

        //base.OnActionExecuting(filterContext);
    }
所以在方法中,我用这个,头作为

[RightChecker(isAdmin=true)]

我正在按如下方式执行此方法

http://localhost:5576/Singer/DeleteSinger?isAdmin=true

问题是我传递的是真还是假。。。我得到的结果变量为false。。。我得到:

异常[空对象引用]


似乎是
context.Request.QueryString[“isAdmin”].ToString()
导致了
NullReferenceException

试一试


您似乎没有在查询字符串中传递
isAdmin=false
isAdmin=true
。它对我有用。但是,您需要处理不传递querystring参数的情况。检查我的实现。正如问题的评论部分所提到的,它不够安全,无法通过查询字符串传递

        public class RightChecker : ActionFilterAttribute
        {
            public bool IsAdmin;            

            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {

               bool result = false;
               if (filterContext.HttpContext.Request.QueryString["isAdmin"] != null)
               {
                       bool.TryParse(filterContext.HttpContext.Request.QueryString["isAdmin"].ToString(), out result);
               }

               if (IsAdmin != result) 
               {
                   //your implementation
               }
            }
        }
你的行动方法

    [RightChecker(IsAdmin=true)]
    public ActionResult AttCheck()
    {
        return View();
    }

来自querystring的检查权限并不是真正安全的。 您可以尝试以下方法: [连结]


但是由于mvc 3 api的变化,一些代码在ActionIsAuthorized方法中被废弃,您可以自己修复,请参见我在此处提出的问题[link]

在您的视图中传递此数据如下所示:

public ActionResult Test(bool testParam)
{
   ViewData["isAdmin"] = testParam;
   return View();
}

哪一行给出了异常?bool result=Convert.ToBoolean(context.Request.QueryString[“isAdmin”].ToString());第行给出一个异常检查查询字符串以确定用户是否是管理员不安全。您可能希望将其存储在insead会话中。作者说他正在传递参数,但仍然得到错误@Asif作者的评论表明,调用
ToString()
时会抛出
NullReferenceException
。因此,我猜测由于某种原因,查询参数没有被传递。无论如何,应该检查
null
,我相信这是我的答案。我想这是他的问题,如果他通过参数,为什么会为null。
public ActionResult Test(bool testParam)
{
   ViewData["isAdmin"] = testParam;
   return View();
}