我的BaseController有一个方法可以返回重定向还是真的?

时间:2016-02-19 14:08:15

标签: c# asp.net-mvc

这个标题具有误导性,但我不确定如何更好地说出来。

我的控制器都继承自BaseController。我想在BaseController中有一个方法,我可以通过各种操作调用它。我想要这样的东西:

public virtual object CheckValues(Guid value1, string value2)
{
    if (value2 == const_SomeValue || value1 == GetCurrentId())
    {
        return true;
    }
    return RedirectToAction("index");
}

基本上,我希望有一种方法可以检查某些事情,如果它失败了,那就是重定向。我的控制器操作会像这样检查:

public virtual ActionResult overview(Guid? id)
{
    CheckValues(id, string.Empty); // on fail this redirects

    // Continue with this Action
    return View();
}

我的许多控制器操作都会使用CheckValues方法。

有没有一个好的或正确的方法呢?

更新: 我想分享我的解决方案。我喜欢它是怎么出来的。

我的控制器现在看起来像这样:

[CheckId()] // I can overload the name of the Id, the redirect Action and/or contoller
public virtual ActionResult overview(Guid? id)
{
    //... Logic for my action
    return View();
}

我的过滤器如下所示:

public class CheckIdAttribute : ActionFilterAttribute
{
    public string IdValue { get; set; }
    public string RedirectAction { get; set; }
    public string RedirectController { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // I wanted to be able to override the redirect and 
        // the name of the id to check if necessary. Or just
        // use defaults.
        if (string.IsNullOrEmpty(IdValue))
            IdValue = "id";

        if (string.IsNullOrEmpty(RedirectAction))
            RedirectAction = "index";

        if (string.IsNullOrEmpty(RedirectController))
            RedirectController = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;

        var isValue1Valid = filterContext.ActionParameters.ContainsKey(IdValue) &&
            (filterContext.ActionParameters[IdValue] != null && (Guid)filterContext.ActionParameters[IdValue] != Guid.Empty);

        if (!isValue1Valid)
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { action = RedirectAction, controller = RedirectController }));
        }
    }
}

1 个答案:

答案 0 :(得分:3)

基类方法的替代方法是动作过滤器。您的控制器操作可能如下所示:

[CheckValues(Value1 = "id", Value2 = "")]
public ActionResult overview(Guid? id)
{
    // Continue with this Action
    return View();
}

然后在操作过滤器中,覆盖OnActionExecuting以检查参数并可能重定向。

public class CheckValuesAttribute : ActionFilterAttribute
{
  public string Value1 { get; set; }
  public string Value2 { get; set; }

  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    var isValue2Valid = filterContext.ActionParameters.ContainsKey(Value2) &&
                        filterContext.ActionParameters[Value2] == const_SomeValue;
    var isValue1Valid = filterContext.ActionParameters.ContainsKey(Value1) &&
                        filterContext.ActionParameters[Value1] == GetCurrentId();

    if (!isValue1Valid || !isValue2Valid)
      filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { action = "Index"}));
  }
}

上面仍然需要进行一些调整来处理Value2缺少/空字符串并将Value1投射到Guid时的情况,但这是它的要点。您设置filterContext.Result的行会使您的操作短路,从而实际上永远不会执行 - 重定向将在请求进入控制器操作之前发生。