2012-08-22 70 views
0

我有一個簡單的jQuery AJAX方法:MVC3不能結合參數在JSON

 var sendData = { personId: "@(Guid.Empty)"}; 
     $.ajax({ 
      type: "POST", 
      url: "@(Url.Action("Dialog", "Dialog")", 
      data: sendData; 
     }).done(function (e) { 
      $('#dialog').html(e); 
      window.resizeDialog(); 
     }); 

在dialogController:

public ActionResult PersonInfo(Guid personId) 
    { 
     .... 
    } 

jQuery將傳遞一個PERSONID作爲的Guid給控制器,控制器將做它的東西,並返回一個PartialView作爲對話框。

這工作得很好,並正在用很多用戶在一些大項目中使用相當多。

但很少(大約1元10.000次點擊)我得到這個例外,我們的記錄:

22-8-2012 14:17:27 ERROR: The parameters dictionary contains a null entry for parameter 'personId' of non-nullable type 'System.Guid' for method 'System.Web.Mvc.ActionResult PersonInfo(System.Guid)' in 'Site.Controllers.DialogController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. 
Parameter name: parameters at System.Web.Mvc.ActionDescriptor.ExtractParameterFromDictionary(ParameterInfo parameterInfo, IDictionary`2 parameters, MethodInfo methodInfo) 
at System.Web.Mvc.ReflectedActionDescriptor.<>c__DisplayClass1.b__0(ParameterInfo parameterInfo) 
at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) 
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.b__12() 
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<>c__DisplayClass17.b__14() 
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<>c__DisplayClass17.b__14() 
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 

我試過被改變$就法的數據類型,但它並沒有幫助。現在我發現,大多數(不是全部)錯誤來自IE8(90%)。

這裏有什麼可能是錯的,我該如何防止這種情況?對於某些方法,我將所有參數設置爲空,我將在稍後的方法中檢查null,但這不是最優的,因爲請求會失敗。

+0

你使用什麼記錄器?嘗試插入Elmah並捕獲所有請求,以便看到控制器正在接收的內容。 –

回答

1

我會說這更可能是您發送數據的問題。我注意到你發佈了JSON對象「原始」(沒有任何類型的解析),這可能是問題所在。嘗試使用JSON.parse或第三方庫,如JSON2.js(跨瀏覽器),看看您的問題是否消失。

+0

你在哪裏看到手動生成JSON字符串?沒有。 –

+0

var jsonText = JSON.stringify({userSquadId:'@(Model.UserSquadId)',personId1:personId1,personId2:personId2,oldSlot:oldSlot,newSlot:newSlot,position:pos,fromBench:fromBench,toBench:toBench}); 這是我使用的一個,我已經在使用JSON.stringify。 – YesMan85

+0

@SergRogovtsev我可能沒有說得那麼正確,我指的是JSON對象被創建併發送到「原始」而不被解析等。@ Rogier21你的示例沒有提到你正在使用'JSON.stringify' 。 – James

0

你忘了註明您的字符串,這樣的JavaScript看起來你的結果一樣:

var sendData = { personId: 00000000-0000-0000-0000-000000000000}; 

這要麼導致0或根本就不工作。請嘗試以下方法:

var sendData = { personId: "@(Guid.Empty)"}; 
+0

好吧,夠公平的,但這是一個代碼示例,當然我不會發送空引導 – YesMan85

+0

@ Rogier21那麼它取決於你發送什麼和如何發送。我們無法對與問題不匹配的代碼進行猜測。 –