从类中重定向到某个动作的正确方法?

时间:2014-03-04 19:24:56

标签: c# asp.net-mvc-4 redirect

背景

我有一个项目分为Web Forms& MVC(谢天谢地,转向MVC)。

我有一个LoginManager类,它接受IRedirectionManager类,并根据用户属性(经过身份验证,密码已过期,未接受的条款)调用重定向管理器上的不同方法(RedirectToLogin) ,RedirectToAcceptTerms等。)

我正在为MVC控制器构建和实现“Redirect Manager”。

问题

  • 这应该是ActionFilter还是Base Class?似乎我可以使用其中之一,但我不确定是否真的如此。
  • 在MVC中重定向到某个操作或路由的适当方法是什么?对于Web表单RedirectManager,我传入响应对象并使用Response.Redirect转到该页面。我希望能够使用RedirectToAction之类的东西来完成这项工作。

代码

如果有助于澄清。 LoginManager

public class LoginManager
{
    private IRedirectManager _redirectManager;
    private string _returnUrl;
    private ClaimsIdentity _currentUser;

    public LoginManager(string attemptingToAccessUrl, ClaimsIdentity identity, IRedirectManager redirectManager)
    {
        if (redirectManager == null) { throw new ArgumentNullException("redirectManager"); }
        if (identity == null) { throw new ArgumentNullException("identity"); }

        _redirectManager = redirectManager;
        _currentUser = identity;
        _returnUrl = attemptingToAccessUrl;
    }

    public void CheckLoginAndRedirect()
    {
        if (!_currentUser.IsAuthenticated)
        {
            if (string.IsNullOrWhiteSpace(_returnUrl)) { _redirectManager.RedirectToLogin(); }
            else { _redirectManager.RedirectToLogin(_returnUrl); }
        }

        if (_currentUser.IsDisabled()) { _redirectManager.RedirectToDisabled(); }

        if (UserRequiresPasswordReset()) { _redirectManager.RedirectToResetPassword(_returnUrl); }

        if (!_currentUser.HasAcceptedTerms()) {
            if (_currentUser.IsExternalUser()){ _redirectManager.RedirectToTermsAcceptance(_returnUrl); }
        }

        if (PasswordIsAboutToExpire())
        {
            if (!_currentUser.HasDeclinedToChangePassword()) { _redirectManager.RedirectToPasswordExpiringSoon(_returnUrl); }
        }
    }
}

以下是WebFormsRedirectManager

的示例
public class WebFormsRedirectManager : IRedirectManager
{
    private HttpContext _httpContext;

    public WebFormsRedirectManager(HttpContext currentHttpContext)
    {
        if (currentHttpContext == null) { throw new ArgumentNullException("currentHttpContext");}

        _httpContext = currentHttpContext;
    }

    public void RedirectToLogin()
    {
        _httpContext.Response.Redirect("~/AccountManagement/Login");

    }
}

我在ProtectedPage类中使用它的示例,其他Web表单页面继承自:{/ p>

public class ProtectedPage : BasePage
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        var redirector = new WebFormsRedirectManager(Context);
        new LoginManager(null, ClaimsPrincipal.Current.Identity as ClaimsIdentity, redirector).CheckLoginAndRedirect();
    }
}

1 个答案:

答案 0 :(得分:0)

如果您查看MVC源代码RedirectToAction(),则返回RedirectoToRouteResult个对象。这个课程正在有效地完成你正在做的事情 - 调用Response.Redirect()

public override void ExecuteResult(ControllerContext context)
{
    ...

    string destinationUrl = UrlHelper.GenerateUrl(
        RouteName, null /* actionName */, null /* controllerName */, 
        RouteValues, Routes, context.RequestContext, 
        false /* includeImplicitMvcValues */);

    ...

    context.HttpContext.Response.Redirect(destinationUrl, endResponse: false);
}