0

我以前遇到过这个问题,但我从来没有很好地解决它。

这是我的 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; }
}

这是动作:

    [HttpPost]
    public PartialViewResult GetSpecifics(TargetList targetList)
    {
        //Code and stuff
    }

TargetList 总是结果为空。我从来没有使用过这样的列表,即使它应该可以工作 OOTB(对吗?)。只有属性而没有列表的“普通”数据模型可以完美运行。

我在这里看到了一些相关的问题,其中一些建议traditional: true$.post. 不工作。我已经对数据进行了字符串化并且没有对数据进行字符串化,但无济于事。如果在传统设置为 true 时未进行字符串化,那么 json 对象就会变成Targets: [Object object]所以我猜它与帖子有关。

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

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

我真的非常感谢任何帮助。

4

2 回答 2

2

Target:是多余的。代表您的模型的 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; }
}

我用

string json = "{ Targets: [{ Target: { Id: -1, EditUrl: \"aaaa\"}}] }";
var validObj = new JavaScriptSerializer().Deserialize<TargetList>(json);
于 2012-06-16T17:30:54.783 回答
1

不确定为什么您的 TargetList 没有正确反序列化。您可以尝试创建自定义 ModelBinder,然后在活页夹中手动反序列化您的 JSON。这将使您的控制器保持清洁。我在我的项目中使用Json.NET作为序列化程序。只需创建您自己的 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 用于需要反序列化的任何其他模型。

于 2012-06-17T21:05:32.683 回答