0

有没有什么方法可以实现一个方便的方法,它使用控制器的受保护方法而不使用基本控制器,这里建议不要这样做?例如,我想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是?)

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

4

1 回答 1

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"));
于 2012-12-07T15:54:33.363 回答