【问题标题】:Monorail cannot read JSON (a list of objects) data received from jQueryMonorail 无法读取从 jQuery 接收的 JSON(对象列表)数据
【发布时间】:2013-02-19 14:57:46
【问题描述】:

我有以下 jquery ajax:

 $(".gridster ul").gridster({
               widget_margins: [5, 5],
               widget_base_dimensions: [280, 280],
               draggable: {
                stop: function(event, ui){ 
                              var orderState = {
        photos:  $(".gridster ul").data("gridster").serialize(),
        promoid: $.getUrlVar('promoId')
        };
       $.ajax({
                url: "/Photos/SetOrder",
                data: {neworder:orderState},
                dataType: 'json',
                type: 'POST'
            });

我发送到 Monorail 2.1 控制器。

JS 中的 orderState 对象如下所示:

neworder[photos][0][height]=1
neworder[photos][0][id]=98315
neworder[photos][0][width]=1
neworder[photos][0][x]=2
neworder[photos][0][y]=1
neworder[photos][1][height]=1
neworder[photos][1][id]=98316
neworder[photos][1][width]=1
neworder[photos][1][x]=1
neworder[photos][1][y]=1
neworder[photos][2][height]=1
neworder[photos][2][id]=98317
neworder[photos][2][width]=1
neworder[photos][2][x]=1
neworder[photos][2][y]=2
neworder[photos][3][height]=1
neworder[photos][3][id]=98318
neworder[photos][3][width]=1
neworder[photos][3][x]=1
neworder[photos][3][y]=3
neworder[promoid]=163844

它应该映射到以下 c# viewmodel 类:

 public class OrderViewModel
    {
        public int height { get; set; }

        public int width { get; set; }

        public int x { get; set; }

        public int y { get; set; }

        public int id { get; set; }
    }

    public class NewPromoImageOrderViewModel
    {
        public NewPromoImageOrderViewModel()
        {
            Photos = new List<OrderViewModel>();
        }

        public int PromoId { get; set; }

        public List<OrderViewModel> Photos { get; set; }
    }

由以下操作使用:

  [return: JSONReturnBinder]
        [AccessibleThrough(Verb.Post)]
        public object SetOrder([JSONBinder("neworder")] NewPromoImageOrderViewModel neworder)
        {
            //bla
        }

它给我的回应是这样的:

消息:构建方法参数时出错。分析的最后一个参数是 neworder 值为 ''

堆栈跟踪:在 Castle.MonoRail.Framework.SmartDispatcherController.BuildMethodArguments(ParameterInfo[] 参数,IRequest 请求,IDictionary2 actionArgs) in C:\Dropbox\Projects\Monorail\castleproject-MonoRail-98c93ac\castleproject-MonoRail-98c93ac\MR2\src\Castle.MonoRail.Framework\SmartDispatcherController.cs:line 329 at Castle.MonoRail.Framework.SmartDispatcherController.InvokeMethod(MethodInfo method, IRequest request, IDictionary2 extraArgs) 在 C:\Dropbox\Projects\Monorail\castleproject-MonoRail-98c93ac\castleproject-MonoRail-98c93ac\MR2\src\Castle.MonoRail.Framework\SmartDispatcherController.cs:line 80 在 Castle.MonoRail.Framework.ActionMethodExecutorCompatible.Execute(IEngineContext engineContext、IController 控制器、IControllerContext 上下文)在 C:\Dropbox\Projects\Monorail\castleproject-MonoRail-98c93ac\castleproject-MonoRail-98c93ac\MR2\src\Castle.MonoRail.Framework\ActionMethodExecutor.cs:line 79 在 Castle.MonoRail.Framework.Controller.RunActionAndRenderView() 在 C:\Dropbox\Projects\Monorail\castleproject-MonoRail-98c93ac\castleproject-MonoRail-98c93ac\MR2\src\Castle.MonoRail.Framework\Controller.cs:line 1639

内部异常:ArgumentNullException

消息:值不能为空。参数名称:s

StackTrace:在 System.IO.StringReader..ctor(String s) 在 Newtonsoft.Json.JsonConvert.DeserializeObject(字符串值,类型类型, JsonSerializerSettings 设置)在 Newtonsoft.Json.JsonConvert.DeserializeObject(字符串值,类型类型) 在 Castle.MonoRail.Framework.Services.NewtonsoftJSONSerializer.Deserialize(字符串 jsonString,类型 expectedType) 在 C:\Dropbox\Projects\Monorail\castleproject-MonoRail-98c93ac\castleproject-MonoRail-98c93ac\MR2\src\Castle.MonoRail.Framework\Services\NewtonsoftJSONSerializer.cs:line 100 在 Castle.MonoRail.Framework.JSONBinderAttribute.Bind(IEngineContext 上下文,IController 控制器,IControllerContext 控制器上下文, ParameterInfo parameterInfo) 中 C:\Dropbox\Projects\Monorail\castleproject-MonoRail-98c93ac\castleproject-MonoRail-98c93ac\MR2\src\Castle.MonoRail.Framework\Attributes\JSONBinderAttribute.cs:line 135 在 Castle.MonoRail.Framework.SmartDispatcherController.BuildMethodArguments(ParameterInfo[] 参数,IRequest 请求,IDictionary`2 actionArgs) 在 C:\Dropbox\Projects\Monorail\castleproject-MonoRail-98c93ac\castleproject-MonoRail-98c93ac\MR2\src\Castle.MonoRail.Framework\SmartDispatcherController.cs:line 288

我很确定我的映射和视图模型类是正确的。 JQuery 确实发送了预期的 json 对象,但 Monorail 似乎在转换它时遇到了问题。这可能是一个错误吗?

编辑:嗯,Monorail 在这里并没有错……我在帖子中放的东西毕竟是 JSON。使用此库后:https://code.google.com/p/jquery-json/,我设法将对象转换为 JSON。我认为通过选择 dataType:"json" 就足够了,但显然不是。

【问题讨论】:

  • 它绝对是一个对象而不是一个字符串吗? dataType: 'json' 应该总是强制它,但我见过它没有的情况
  • 我怎么知道它是否是一个对象?当我切换到一个由手工挑选的原始值组成的 JSON 对象时,比如 {first:1, second:"adad"},并更改了服务器端的代码,Monorail 正确解析了参数。我认为这是一个对象。
  • 在浏览器上你会使用console.log,如果它是可扩展的它是一个对象,如果它只是显示为一个字符串它是一个字符串。在代码中,您将使用 is_object()typeof 之类的函数,无论 c# 中的函数是什么。
  • 如果我将 orderState 放在控制台日志中,当我枚举照片列表时,它会显示为可扩展。
  • 另外,我检查了 JSON 对象是否真的是一个对象,是的,它是(使用来自网络的 is_object 函数())。

标签: c# asp.net-mvc castle-monorail


【解决方案1】:

$.ajax 调用中的数据类型选项指的是预期的数据。你需要做的是:

$.ajax({
  url: "/Photos/SetOrder",  
  contentType: 'application/json; charset=utf-8',
  data: JSON.stringify({neworder:orderState}),
  type: 'POST'
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多