【发布时间】:2012-11-25 19:27:25
【问题描述】:
有没有什么方法可以实现一个方便的方法,它使用控制器的受保护方法而不使用基本控制器,推荐反对here?例如,我想根据是否传递了returnUrl 查询字符串参数来返回ActionResult。我真正想要的是这样的扩展方法:
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?)
有没有一种不错的方法可以在不使用基本控制器的情况下做到这一点?如果不是,这可能是实际使用基本控制器的一个很好的理由,还是我的设计存在缺陷?
【问题讨论】:
-
虽然我不相信可以从扩展方法访问任何非公共方法/属性,但您是否可以返回
new RedirectResult而不是controller.Redirect? -
嗯,很可能。但是
RedirectToAction呢? -
您或许可以使用
UrlHelper.Action来确定网址。 msdn.microsoft.com/en-us/library/dd504960.aspx
标签: c# asp.net-mvc oop base-class