我有一个项目分为Web Forms& MVC(谢天谢地,转向MVC)。
我有一个LoginManager
类,它接受IRedirectionManager
类,并根据用户属性(经过身份验证,密码已过期,未接受的条款)调用重定向管理器上的不同方法(RedirectToLogin) ,RedirectToAcceptTerms等。)
我正在为MVC控制器构建和实现“Redirect Manager”。
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();
}
}
答案 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);
}