这个标题具有误导性,但我不确定如何更好地说出来。
我的控制器都继承自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 }));
}
}
}
答案 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
的行会使您的操作短路,从而实际上永远不会执行 - 重定向将在请求进入控制器操作之前发生。