1

在使用 C# 的 MVC 3 中,我想重定向某些未经验证的方法。但是,这似乎不起作用:

    private ActionResult m_VerifyLogin()
    {
        if (Session["isLogged"] == null || (int)Session["isLogged"] != 1)
        {
            return RedirectToAction("Index", "Home");
        }

        return View();
    }

有谁知道我能做什么?即使我创建了一个 ActionFilterAttribute 我希望它非常简单!

- 编辑 -

感谢您的所有回答。我们尝试了您提出的一些问题,然后在测试后提出了这个问题:

自定义 ActionFilterAttribute:

public class IsLoggedAttribute : ActionFilterAttribute
{

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Session["isLogged"] == null || (int) filterContext.HttpContext.Session["isLogged"] != 1)
        {
            filterContext.HttpContext.Response.RedirectToRoute(new { controller = "Home" });
        }

        base.OnActionExecuting(filterContext);
    }

}

我可以将 [IsLogged] 抛出到路由方法之上。

4

2 回答 2

5

制定你的行动方法public。您的代码看起来不错,因为要重定向到另一个动作/控制器,动作方法可以通过RedirectToActionController 基类的方法返回。

public ActionResult m_VerifyLogin()
{
    if (Session["isLogged"] != null || (int)Session["isLogged"] != 1)
    {
        return RedirectToAction("Index", "Home");
    }
    return View();
}

你的if说法也有点奇怪。您检查会话中的值是否为空,并使用OR逻辑运算符将其强制转换(可能为空)以使用值进行测试。你可以尝试做这样的事情:

//If session value is not null then try to cast to int and check if it is not 1.
if (Session["isLogged"] != null || (int)Session["isLogged"] != 1)

如果控制器中的Index操作已应用并且当前用户无效,您将获得重定向到表单身份验证配置中定义的登录页面。您还可以使用具有更好名称的操作方法名称来获取友好的 url,例如.HomeActionFilterAttributeVerifyLogin

public ActionResult VerifyLogin()
{
    if (Session["isLogged"] != null || (int)Session["isLogged"] != 1)
    {
        return RedirectToAction("Index", "Home");
    }
    return View();
}
于 2013-01-18T18:53:51.460 回答
2

RedirectToAction()返回一个对象,当您从您的操作RedirectToRouteResult返回时,该对象告诉 MVC 发送重定向。

调用方法而不使用它的返回值不会做任何事情。

您需要从操作本身返回私有方法的结果。

于 2013-01-18T18:57:42.467 回答