2

Currently using MVC3 and using jQuery $.post function to send the ajax request to the controller action called "SearchInitiated". I'm having a little bit of a head-scratcher here because I'm not sure exactly where my issues lies. I'm sure its something minor that I have overlooked.

When I call my Controller method from an AJAX call, I am passing a json object (stringified) to a controller action. See below:

Request Headers from Chrome

Accept:/ Content-Type:application/x-www-form-urlencoded; charset=UTF-8 User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko)

Chrome/24.0.1312.52 Safari/537.17

X-Requested-With:XMLHttpRequest

Form Dataview

connectorId:1

sessionId:97e2d8b2-be9e-4138-91ed-42ef9c6a2cd6

パーティ: {"Tag":null,"PartyIdentifier":"1","Address":null,"Address2":null,"BusinessName":"","CellPhoneNumber":null,"CIF":""," City":null,"Country":null,"DateOfBirth":null,"EMailAddress":null,"EmploymentTitle":null,"EmployerAddress":null,"EmployerAddress2":null,"EmployerCity":null,"EmployerName" :null,"EmployerPhoneNumber":null,"EmployerState":null,"EmployerZip":null,"Fax":null,"Firstname":"TEST","Lastname":"USER","MailingAddress":null," MailingAddress2":null,"MailingCity":null,"MailingState":null,"MailingZip":null,"ミドルネーム":null,"PhoneNumber":null,"State":null,"TIN":"1111111","WorkPhoneNumber":null,"Zip":null}

JavaScript

 var parties =    @(Html.Raw(Json.Encode(Model.SearchParties)));
      function SearchForCustomer(id)
      {

      var currentSelectedParty = GetPartyById(id)
      //SearchPost is a wrapper for $.ajax using default values for dataType and contentType
      SearchPost(URL, {
                'connectorId': '@Model.ConnectorId',
                'sessionId': '@Model.SessionId',            
                'party' :  JSON.stringify( currentSelectedParty ) 
            }
      }

コントローラ

 public ActionResult SearchInitiated(int connectorId, string sessionId, SearchParty party)
 {
     code here....
 }

 public class SearchParty
    {
        public SearchParty();
        public SearchParty(string lastname, string firstname);

        public string Address
        {
            get;
            set;
        }
           public string City
        {
            get;
            set;
        }
        public string Country
        {
            get;
            set;
        }
        public string DateOfBirth
        {
            get;
            set;
        }

        .... etc etc
}

ただし、パーティ オブジェクトは null です。

コードを次のように変更すると、すべてが厳密に型指定されたオブジェクトに正しく逆シリアル化されます。

 public ActionResult SearchInitiated(int connectorId, string sessionId, string party)
 {
     JavaScriptSerializer json_serializer = new JavaScriptSerializer();
            SearchParty sp =
                   json_serializer.Deserialize<SearchParty>(party);
 }

私のjson文字列は2番目のコードスニペットで機能しており、値が呼び出しで渡されているため、有効であることはわかっています。他に何が欠けている可能性がありますか?

4

5 に答える 5

3

これを試して。

public class SearchParty
{
  public string party { get; set; }

}

  [HttpPost]
  public ActionResult SearchInitiated(SearchParty party)
   {     
       ....
       return View();

  }
于 2013-01-09T12:31:29.937 に答える
2

おそらく、従来のスタイルの paramシリアライゼーションtraditionalを実現するために、jQuery.ajaxの prop を true に設定する必要があります。

ドキュメントの準備が整った直後に以下のコード行を配置します

$(function(){
 jQuery.ajaxSettings.traditional = true;
});

このSOの質問はさらに役立つかもしれません

于 2013-01-09T04:41:16.407 に答える
1

シリアル化せずにコントローラーで強く型付けされたオブジェクトを取得するには、コントローラーでクラス'SearchParty'を宣言する必要があります。

public class SearchParty  
{
 public string party { get; set; }
}

public ActionResult SearchInitiated(SearchParty party)
{
 code here....
}

このリンクもチェックしてください

于 2013-01-09T04:26:31.437 に答える
1

モデルに [Serializable] 属性があることを確認します。また、リクエストで party={myjson} が指定されていることを確認してください。

于 2013-01-08T22:26:27.697 に答える
1

これへのjavascript ajax呼び出しを変更して、エラーを解決しました。

 SearchPost(URL, JSON.stringify( {
            'connectorId': '@Model.ConnectorId',
            'sessionId': '@Model.SessionId',            
            'party' :   currentSelectedParty  
        }))

「パーティ」オブジェクトだけでなく、ajax 呼び出しで送信されたデータ オブジェクト全体を文字列化する必要がありました。

于 2013-01-11T17:45:42.650 に答える