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されますか?)

ベースコントローラーを使用せずにこれを行うことができる適切な方法はありますか?そうでない場合、これが実際にベースコントローラーを使用する理由の1つでしょうか、それとも私の設計に欠陥がありますか?

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 に答える