有没有什么方法可以实现一个方便的方法,使用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
?)
在不使用基本控制器的情况下,我能做到这一点吗?如果没有,这可能是实际使用基本控制器的一个很好的理由,还是我的设计存在缺陷?
答案 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"));