C# 带有数据模型的列表赢得';无法绑定到json对象
我以前有过这个问题,但我从来没有用一种好的方式解决过 这是我的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
{ 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不起作用。。。