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は常にnullであることがわかります。OOTBで動作するはずなのに、このようなリストを使用することはできませんでした(右?)。プロパティのみでリストがない「通常の」データモデルは完全に機能します。

私はここでいくつかの関連するQを見ました、そしてそれらのいくつかはにあることを提案しtraditional: trueました$.post。動作しません。私はデータを文字列化しましたが、無駄にしました。Traditionalが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 に答える