【问题标题】:Implementing convenience methods that use Controller protected methods?实现使用控制器保护方法的便捷方法?
【发布时间】: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


【解决方案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"));

【讨论】:

  • 是的,回调控制器。不错,但如果RedirectToAction 等没有愚蠢的隐私限制,则没有必要。
  • 好的,我根据您的解决方案提出了这个解决方案:pastebin.com/fcMuXbGb - 如果您用这个解决方案替换您的解决方案,我会将您的解决方案标记为正确答案。
猜你喜欢
  • 2015-01-16
  • 2016-01-20
  • 2011-09-09
  • 2014-03-24
  • 2016-10-18
  • 2011-10-15
  • 1970-01-01
  • 2017-06-29
  • 2016-07-06
相关资源
最近更新 更多