我有一个简单的jQuery ajax方法:
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作为对话框。
这很好用,并且在一些拥有众多用户的大项目中被大量使用。
但很少(每10,000次点击大约1次)我的记录器得到了这个例外:
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)
我尝试的是更改$ .ajax方法的DataType,但它没有帮助。现在我发现MOST(并非所有)错误来自IE8(90%)。
这里可能出现什么问题,如何防止这种情况发生?对于某些方法,我使所有参数都可以为空,我将在稍后的方法中检查null,但这不是最佳的,因为请求将失败。
答案 0 :(得分:1)
我想说这可能是您发送的数据存在问题。我注意到你发布了JSON对象“raw”(没有任何类型的解析),这可能是问题所在。尝试使用JSON.parse或第三方库,例如JSON2.js(跨浏览器),看看您的问题是否消失。
答案 1 :(得分:0)
您忘记引用字符串,因此您的结果javascript看起来像:
var sendData = { personId: 00000000-0000-0000-0000-000000000000};
将导致0
或根本不起作用。请尝试以下方法:
var sendData = { personId: "@(Guid.Empty)"};