2013-03-21 4 views
2

이것은 불가능한 것처럼 보입니다. 실종되었지만 매우 간단합니다. 그러나 나는 그것을 보지 못했습니다. 작업 방법의 내부Asp.NET MVC4 리디렉션 (URL) throwing argument exception

나는 ISBLANK()가

POST /login?ReturnUrl= 
UserName=xxxx&Password=xxxx 

하지만

public static bool IsBlank(this string s) 
    { 
     return String.IsNullOrWhiteSpace(s); 
    } 

어떻게 든 구현

var redirectUrl = FormsAuthentication.GetRedirectUrl(model.UserName, false); 

    if (redirectUrl.IsBlank()) 
    { 
     return RedirectToRoute(Routes.HomeUrl); 
    } 
    else 
    { 
     return Redirect(redirectUrl); 
    } 

그리고이 코드는 제품이 오류를 관리해야

ArgumentException: Value cannot be null or empty. 
Parameter name: url] 
    System.Web.Mvc.Controller.Redirect(String url) +113 
    WebHost.Controllers.SecurityController.Login(LoginModel model) +200 
    lambda_method(Closure , ControllerBase , Object[]) +104 
    System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14 
    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +182 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27 
    System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +28 
    System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +10 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32 
    System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +58 
    System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +225 
    System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +10 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34 
    System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +24 
    System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +99 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 
    System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14 
    System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55 
    System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +39 
    System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55 
    System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +29 
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 
    System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25 
    System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55 
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +31 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9629296 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 
+0

를, 내가 뭔가가 추측 만 할 수 있습니다/ – chrisortman

답변

0

액션을 단순한 URL이 아닌 리디렉션해야한다고 생각합니다.

이 같은 것을보십시오 :

Response.Redirect(Url.RouteUrl(new{ controller="controller", action="action"})); 
+0

사실이 아닙니다.'return Redirect (url)'은 완벽하게 유효합니다. – mattytommo

+0

은 디버깅 중일 때 Home.Url이 설정되어 있습니까? –

+0

예, public const string HomeUrl = "home"; – chrisortman

0

이 시도 : 나는 반환 URL의 값을 추적 로깅 문을 추가하여이 문제를 해결할 수 있어요

var redirectUrl = FormsAuthentication.GetRedirectUrl(model.UserName, false); 

if (Url.IsLocalUrl(redirectUrl)) 
{ 
    return Redirect(redirectUrl); 
} 
else 
{ 
    return RedirectToRoute(Routes.HomeUrl); 
}