2013-03-21 55 views
2

這似乎是不可能的,我敢肯定有一些非常簡單的我失蹤了,但我只是沒有看到它。Asp.NET MVC4重定向(網址)拋出參數異常

內的操作方法我有這樣的代碼

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

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

而且ISBLANK()實現

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

不知怎的,雖然

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

管理,以產品這一錯誤

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

我能夠通過添加日誌報表追溯返回URL的值來解決這個問題,我只能猜測的東西是被優化掉:/ – chrisortman 2013-03-21 15:36:10

回答

0

我認爲一個動作需要重定向到一個動作,而不是一個簡單的URL。

嘗試是這樣的:

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

不正確,'return Redirect(url)'是完全有效的。你在調試時是否設置了Home.Url? – mattytommo 2013-03-21 14:34:33

+0

? – 2013-03-21 14:35:21

+0

是的,公共const字符串HomeUrl =「home」; – chrisortman 2013-03-21 14:57:53

0

試試這個:

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

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