Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON对象未正确发送到我的ASP.NET MVC控制器,缺少属性_Javascript_Asp.net_Json_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

Javascript JSON对象未正确发送到我的ASP.NET MVC控制器,缺少属性

Javascript JSON对象未正确发送到我的ASP.NET MVC控制器,缺少属性,javascript,asp.net,json,asp.net-mvc,asp.net-mvc-3,Javascript,Asp.net,Json,Asp.net Mvc,Asp.net Mvc 3,我在将JSON对象传递到ASP.NET MVC控制器时遇到问题 JSON在JS中的设置方式如下: jsonChildren = '{ "childImproItems" : [{ "Theme":"tralalali" }, { "Theme":"tralalali" }]}'; ... $.ajax({ url: url, type: 'POST', data: JSON.parse(jsonChildren)

我在将JSON对象传递到ASP.NET MVC控制器时遇到问题

JSON在JS中的设置方式如下:

 jsonChildren = '{ "childImproItems" : [{ "Theme":"tralalali"  }, { "Theme":"tralalali"  }]}';
...
  $.ajax({
           url: url,  
            type: 'POST',
            data: JSON.parse(jsonChildren),
            success: function (result) {
              ...  
            },
            error: function (result) {
              ..
            }
        });
在我的控制器内:

public int MyMethod(String typeName, SelectOptionsViewModel id) {
  return 0;
}
有关的型号类别如下:

public class SelectOptionsViewModel {
        ...
  public List<ChildImproItemViewModel> childImproItems { get; set; }
}
   JSONFormatChildren = {};
    JSONFormatChildren.childImproItems = {};
    JSONFormatChildren.childImproItems[0] = {};
    JSONFormatChildren.childImproItems[0].Theme = 'trouloulou';
    JSONFormatChildren.childImproItems[1] = {};
    JSONFormatChildren.childImproItems[1].Theme = 'trouloulou';
调试器将我正确地路由到我的控制器,并将JSON正确地解释为SelectOptions ViewModel实例。 它使用2个对象的列表正确设置其childImproItems属性。 但是2个childImproItems对象的Theme属性为null,尽管在我的示例中,它们应该设置为一个伪值。 其他属性也会发生同样的情况

你们知道我的错在哪里吗

thx提前

编辑: 如果我自己创建JSON对象,也会发生同样的情况,如下所示:

public class SelectOptionsViewModel {
        ...
  public List<ChildImproItemViewModel> childImproItems { get; set; }
}
   JSONFormatChildren = {};
    JSONFormatChildren.childImproItems = {};
    JSONFormatChildren.childImproItems[0] = {};
    JSONFormatChildren.childImproItems[0].Theme = 'trouloulou';
    JSONFormatChildren.childImproItems[1] = {};
    JSONFormatChildren.childImproItems[1].Theme = 'trouloulou';
然后是ajax:

 $.ajax({
            url: url,  //We can't pass the selectId directly as C# does not know about JS variables
            type: 'POST',
            data: JSONFormatChildren,
....
}
同样,列表是使用正确的元素数量(2)正确创建的,但是所有元素的主题属性都是null,而不是trouloulou

编辑2: 如果我使用这个JSON:

 jsonChildren = '{"Theme":"tralalali"}';
 jsonChildren = '[{"Theme":"tralalali"},{"Theme":"tralalali"}]'; 
这种方法:

 public int test2(String typeName, ChildImproItemViewModel id) 
    {
        return 0;
    }
   public int test2(String typeName, List<ChildImproItemViewModel> id) 
    {
        return 0;
    }
它很好用

如果我使用这个JSON:

 jsonChildren = '{"Theme":"tralalali"}';
 jsonChildren = '[{"Theme":"tralalali"},{"Theme":"tralalali"}]'; 
这种方法:

 public int test2(String typeName, ChildImproItemViewModel id) 
    {
        return 0;
    }
   public int test2(String typeName, List<ChildImproItemViewModel> id) 
    {
        return 0;
    }
public int test2(字符串类型名,列表id)
{
返回0;
}

它不起作用:调用方法时id=null

您需要正确地将内容类型指定为json,因为jquery中的默认内容是表单url编码的。另外,我认为JSON.Parse函数是不必要的,可以尝试使用它,也可以不使用它

编辑:我刚刚注意到您正试图手动创建一个JSON字符串。这不是一个好主意,只需创建一个Javascript对象,然后使用JSON.stringify()。否则,很容易搞乱JSON字符串语法。如果您支持旧浏览器,则可能需要包含json2.js库

var     jsonChildren = { "childImproItems" 
: [{ "Theme":"tralalali"  }, { "Theme":"tralalali"  }]};
    ...

  $.ajax({
           url: url,  
            type: 'POST',
            data: JSON.stringify(jsonChildren),
            contentType: 'application/json',
            success: function (result) {
              ...  
            },
            error: function (result) {
              ..
            }
        });

在使用json处理模型绑定器问题时,我发现一些有用的东西是。这将让您看到json在C#中解析成什么(显然),这样您就可以看到问题是否出在您的实际json或其他方面。不过,解析我的JSON字符串最终得到的模型类显然是正确的。@请编辑您的问题,将签名包含到接受该问题的ActionResult中JSON@AD我刚才注意到的另一个问题是,您的
jsonChildren
试图将JSON构造为字符串。算了吧。只需创建一个Javascript对象并将其传递给jQueryAjax函数。我会更新我的answer@AD向AjaxType添加contentType:“application/json”似乎不是原因,如果我添加contentType,它将调用error函数,而不再调用success函数。@A D您是否在使用json.parse和不使用json.parse时都尝试过它?@AD如果它调用JS error函数,则ActionResult返回错误代码,很可能表明绑定失败,顺便说一句,这是您的初始问题,因为模型绑定不起作用。这可能会导致真正的问题,比如类型不匹配或其他问题。错误函数中的消息是什么?例外情况是什么?如果没有JSON.parse,情况会更糟,当(String typeName,SelectOptions ViewModel id)被调用时,我将不再将childImproItems识别为列表。所以它必须是JSON.parse。当指定contentType:“application/JSON”时,正如前面提到的,它会触发错误gfunction,Chrome工具只指定发生了内部错误500,我没有更多可见的详细信息。我不认为这是问题的原因。如果我不指定它,JSON将被解释为SelectOptions ViewModel,并且它的列表是使用正确数量的元素正确创建的。只有每个元素的主题属性不起作用。