Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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
C# 带有数据模型的列表赢得';无法绑定到json对象_C#_Jquery_Json_Asp.net Mvc 3_Post - Fatal编程技术网

C# 带有数据模型的列表赢得';无法绑定到json对象

C# 带有数据模型的列表赢得';无法绑定到json对象,c#,jquery,json,asp.net-mvc-3,post,C#,Jquery,Json,Asp.net Mvc 3,Post,我以前有过这个问题,但我从来没有用一种好的方式解决过 这是我的JSON对象: { Targets: [{ Target: { Id: -1, EditUrl: editUrl}}] } 以下是我使用的模型: public class TargetList { public List<Target> Targets { get; set; } } public class Target { public int Id { get; set; } public

我以前有过这个问题,但我从来没有用一种好的方式解决过

这是我的JSON对象:

{ Targets: [{ Target: { Id: -1, EditUrl: editUrl}}] }
以下是我使用的模型:

public class TargetList
{
    public List<Target> Targets { get; set; }
}

public class Target
{
    public int Id { get; set; }
    public string EditUrl { get; set; }
}
TargetList结果总是为null。我从来没有能够使用像这样的列表,即使它应该工作OOTB(对吗?)。只有属性而没有列表的“普通”数据模型可以完美地工作

我在这里看到了一些相关的Qs,其中一些建议在
$.post
中使用
传统:true
。不起作用。我对数据进行了字符串化和非字符串化,但都无济于事。如果在将traditional设置为true时未进行字符串化,json对象将变成
Targets:[object object]
,因此我猜它与post有关

我可以手动绑定我的对象吗?在某些情况下,是否覆盖工厂?我觉得我需要更多地控制这个功能

我正在使用MVC3、.NET4和jQuery-1.7.2


我真的非常感谢你的帮助

目标:
是冗余的。表示模型的Json字符串应该是

{"Targets":[{"Id":1,"EditUrl":"aaa"},{"Id":2,"EditUrl":"bbb"}]}
如果可以,请将其从Json字符串中删除。否则,将您的类声明为:

public class TargetList
{
    public List<Target1> Targets { get; set; }
}

public class Target1
{
    public Target2 Target;
}

public class Target2
{
    public int Id { get; set; }
    public string EditUrl { get; set; }
}
公共类目标列表
{
公共列表目标{get;set;}
}
公共类Target1
{
公共目标2目标;
}
公共类Target2
{
公共int Id{get;set;}
公共字符串EditUrl{get;set;}
}
我试过了

string json = "{ Targets: [{ Target: { Id: -1, EditUrl: \"aaaa\"}}] }";
var validObj = new JavaScriptSerializer().Deserialize<TargetList>(json);
string json=“{Targets:[{Target:{Id:-1,EditUrl:\'aaaa\'}]}”;
var validObj=新的JavaScriptSerializer()。反序列化(json);

目标:
是冗余的。表示模型的Json字符串应该是

{"Targets":[{"Id":1,"EditUrl":"aaa"},{"Id":2,"EditUrl":"bbb"}]}
如果可以,请将其从Json字符串中删除。否则,将您的类声明为:

public class TargetList
{
    public List<Target1> Targets { get; set; }
}

public class Target1
{
    public Target2 Target;
}

public class Target2
{
    public int Id { get; set; }
    public string EditUrl { get; set; }
}
公共类目标列表
{
公共列表目标{get;set;}
}
公共类Target1
{
公共目标2目标;
}
公共类Target2
{
公共int Id{get;set;}
公共字符串EditUrl{get;set;}
}
我试过了

string json = "{ Targets: [{ Target: { Id: -1, EditUrl: \"aaaa\"}}] }";
var validObj = new JavaScriptSerializer().Deserialize<TargetList>(json);
string json=“{Targets:[{Target:{Id:-1,EditUrl:\'aaaa\'}]}”;
var validObj=新的JavaScriptSerializer()。反序列化(json);

不确定目标列表未正确反序列化的原因。您可以尝试创建自定义ModelBinder,然后在binder中手动反序列化JSON。这将保持控制器清洁。我在项目中用作序列化程序。只需创建您自己的ModelBinder:

public class CustomModelBinder : IModelBinder
{
  public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  {
    string inputContent;
    using (var sr = new StreamReader(controllerContext.HttpContext.Request.InputStream))
    {
      inputContent = sr.ReadToEnd();
    }
    //JsonConvert is part of Json.NET
    var result = JsonConvert.DeserializeObject(inputContent, bindingContext.ModelType);
    return result;
  }
}
然后在Global.asax.cs中为TargetList设置ModelBinder:

protected void Application_Start()
{
  ModelBinders.Binders[typeof(TargetList)] = new CustomModelBinder();
}

您还可以将ModelBinder用于需要反序列化的任何其他模型。

不确定您的TargetList未正确反序列化的原因。您可以尝试创建自定义ModelBinder,然后在binder中手动反序列化JSON。这将保持控制器清洁。我在项目中用作序列化程序。只需创建您自己的ModelBinder:

public class CustomModelBinder : IModelBinder
{
  public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  {
    string inputContent;
    using (var sr = new StreamReader(controllerContext.HttpContext.Request.InputStream))
    {
      inputContent = sr.ReadToEnd();
    }
    //JsonConvert is part of Json.NET
    var result = JsonConvert.DeserializeObject(inputContent, bindingContext.ModelType);
    return result;
  }
}
然后在Global.asax.cs中为TargetList设置ModelBinder:

protected void Application_Start()
{
  ModelBinders.Binders[typeof(TargetList)] = new CustomModelBinder();
}

您也可以将ModelBinder用于任何其他需要反序列化的模型。

谢谢您的回复,但是,它对我不起作用。我尝试了你的测试,确实得到了一个目标,但是属性为空。您正在使用MVC3吗?我想这实际上可能是个bug…我用最后两行来反序列化测试字符串。您还可以通过
var jsonstr=new JavaScriptSerializer().Serialize(targetList)来测试反向代码
如果我将json字符串作为操作的参数,然后手动反序列化该字符串,它就会起作用。这很难看,但现在可以了。谢谢你给我指明了正确的方向。我仍然很好奇为什么直接绑定到TargetList不起作用……谢谢你的回复,但是,它对我不起作用。我尝试了你的测试,确实得到了一个目标,但是属性为空。您正在使用MVC3吗?我想这实际上可能是个bug…我用最后两行来反序列化测试字符串。您还可以通过
var jsonstr=new JavaScriptSerializer().Serialize(targetList)来测试反向代码
如果我将json字符串作为操作的参数,然后手动反序列化该字符串,它就会起作用。这很难看,但现在可以了。谢谢你给我指明了正确的方向。我仍然很好奇为什么直接绑定到TargetList不起作用。。。