实现使用Controller保护方法的便捷方法?

时间:2012-12-07 15:33:37

标签: c# asp.net-mvc oop base-class

有没有什么方法可以实现一个方便的方法,使用Controller的受保护方法而不使用基本控制器,建议针对here?例如,我想根据是否已传递ActionResult查询字符串参数返回returnUrl。我真正想要的是这样的扩展方法:

public static class ControllerExtensions {
    public static ActionResult RedirectReturnUrlOrDefaultAction(this Controller thisController, string returnUrl, string defaultAction) {
        if (!string.IsNullOrEmpty(returnUrl) && thisController.Url.IsLocalUrl(returnUrl)) {
            return thisController.Redirect(returnUrl);
        }
        else {
            return thisController.RedirectToAction(defaultAction);
        }
    }
}

这样我就可以说:

return this.RedirectReturnUrlOrDefaultAction(Request.QueryString["returnUrl"], "Index");

...来自Controller。但当然,扩展方法无法编译,因为出于某种原因,像Redirect这样的方法是protected internal(顺便说一下,为什么它们是protected internal?)

在不使用基本控制器的情况下,我能做到这一点吗?如果没有,这可能是实际使用基本控制器的一个很好的理由,还是我的设计存在缺陷?

1 个答案:

答案 0 :(得分:1)

怎么样:

public static class ControllerExtensions {
    public static ActionResult RedirectReturnUrlOrDefaultAction(this Controller controller, Func<string, ActionResult> returnUrlRedirectAction, Func<ActionResult> defaultAction) {
        string returnUrl = controller.Request.QueryString["returnUrl"];
        if (!string.IsNullOrEmpty(returnUrl) && controller.Url.IsLocalUrl(returnUrl)) {
            return returnUrlRedirectAction(returnUrl);
        }
        else {
            return defaultAction();
        }
    }
}

然后可以在控制器中使用它:

return this.RedirectReturnUrlOrDefaultAction(ret => Redirect(ret), () => RedirectToAction("Index"));