2016-12-18 10 views
1

JSONオブジェクトをコントローラメソッドparamに渡す方法を理解しようとしています。私はしばしばフォームをポストするときにJSON.serialize()を使用し、C#へのシリアライゼーションは自動的に行います。しかし、私はGETを使って部分的に読み込もうとしているときにこれを動作させるのに苦労しています。.NET MVC jQuery AJAX - 値をシリアル化しないパラメータとしてのJSONオブジェクト

私は、必要なものの基本的なシミュレーションとして小さなサンプルプロジェクトを構築しました。これは、int paramと別のモデルクラスを受け入れるコントローラメソッドです。これはJSONとして渡したいものです。部分的なhtml応答がdivに読み込まれます。

ビュー:

<div class="row"> 
    Loading a partial via Ajax, passing a JSON object as a param! 
</div> 
<div class="row"> 
    <div id="peoplePartial"></div> 
</div> 

@section Scripts { 
    <script> 
     $(function() { 
      var id = 1; 
      var person = { 
       Name: "Homer Simpson", 
       Age: 45 
      }; 
      load(id, person); 
     }); 

     function load(id, person) { 
      $.ajax({ 
       cache: false, 
       type: "GET", 
       dataType: "html", 
       url: '/Home/PeoplePartial', 
       data: { 
        id: id, 
        person: JSON.stringify(person) 
       } 
      }).done(function(data) { 
       $("#peoplePartial").html(data); 
      }).fail(function(data) { 
       console.log(data.responseText); 
      }); 
     } 
    </script> 
} 

部分:

@model MVCLearning.Models.PeoplePartialModel 

<div> 
    <span>Person found! Name is @Model.Person.Name</span> 
</div> 

部分のViewModel:

public class PeoplePartialModel { 
    public int Id { get; set; } 
    public PersonModel Person { get; set; } 
} 

私はシリアライズしようとしているデータモデル/エンティティ

public class PersonModel { 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

そして最後に、コントローラ:

public class HomeController : Controller { 
    public ActionResult Index() { 
     return View(); 
    } 

    public ActionResult PeoplePartial(int id, PersonModel person) { 
     if (person != null) { 
      var model = new PeoplePartialModel { 
       Id = id, 
       Person = person 
      }; 
      return PartialView("_People", model); 
     } else { 
      throw new System.Exception("An Error Has occoured"); 
     } 
    } 
} 

は、 "ID" paramが常にもちろん、動作しますが、JSON.stringify()を使用している場合PeopleModelのparamは常にnullです。私はそれがモデルにシリアル化され、ビューからJSから渡されたJSON値を含むと予想していました。 JSON.stringify()を使用せずにこの問題を解決できますが、値は常に無視されます。常にName:null、Age:0として渡されます。私はこのような値を渡すことはできません。

私はPOSTへのajax呼び出しを変更しようとしましたが、何も変わりません。 contentTypeをhtmlとjsonに設定しようとしましたが、何も変更しません。

ありがとうございます。

+0

'GET'では、' JSON.stringify() 'と' PeoplePartial(int id、[FromUri] PersonModel person) 'アクションで' GET'を渡します。基本的には、[ネットワーク]タブを確認し、データがクエリ文字列として渡されているかどうかを確認します。 – Developer

答えて

1

私はそれを得ました。ここではプロパティの魔法の組み合わせがあります:

私が試みたバリエーションの1つは、contentTypeが設定されたPOSTでした。それは両方のコントローラメソッドのパラメータが間違っているというエラーをスローします。私もこれでdataTypeを省略することができ、それは動作します。私はのGETのバリエーションを得ることができませんでしたが、GETは私がやろうとしているものです。なぜこれが当てはまるのか本当に知りたいです。

+1

GETは 'data:{id:1、Name:" Homer Simpson "、Age:45}と' 'dataType'を省略した場合にのみ動作します - ajax関数はレスポンスに基づいて推測しますそれを解決する。そして、bodyがないので、 'contentType: 'json''をGETに使うことはできません。 –

+0

@StephenMuecke - あなたは正しいです。残念ながら、私が対処しなければならないモデルは記述されているように見えますが、このPOSTソリューション以外のオプションはありません。 –

+0

もちろんGETを使うことができます(私の最初のコメントの最初の行を見てください) –

関連する問題