MVC 3 JSON字符串未序列化为Controller操作

时间:2013-01-08 21:02:53

标签: asp.net-mvc json asp.net-mvc-3

目前正在使用MVC3并使用jQuery $ .post函数将ajax请求发送到名为“SearchInitiated”的控制器操作。我在这里有一点头脑,因为我不确定我的问题到底在哪里。我确信这是我忽略的一些小问题。

当我从AJAX调用中调用我的Controller方法时,我将json对象(字符串化)传递给控制器​​操作。见下文:

从Chrome请求标头

  

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

     

Chrome / 24.0.1312.52 Safari / 537.17

     

X-请求-随着:XMLHttpRequest的

表单数据视图

  

而connectorID:1

     

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

     

方:   { “标签”:空, “PartyIdentifier”: “1”, “地址”:空, “地址2”:空, “BUSINESSNAME”: “”, “CellPhoneNumber”:空, “到岸价格”: “”, “城市” :空, “国家”:空, “出生日期”:空, “EMAILADDRESS”:空, “EmploymentTitle”:空, “EmployerAddress”:空, “EmployerAddress2”:空, “EmployerCity”:空, “EmployerName”:空“EmployerPhoneNumber”:空, “EmployerState”:空, “EmployerZip”:空, “传真”:空, “名字”: “TEST”, “姓氏”: “用户”, “MailingAddress”:空, “MailingAddress2” :空, “MailingCity”:空, “MailingState”:空, “MailingZip”:空, “中间名”:空, “******中国”:空, “国家”:空, “天”: “1111111”, “WorkPhoneNumber” :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
}

但是,派对对象为空。

如果我将代码更改为以下内容,则所有内容都会正确地反序列化为强类型对象。

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

我知道我的json字符串是有效的,因为它在第二个代码片段中工作,并且值正在调用中传递。我还能错过什么?

5 个答案:

答案 0 :(得分:3)

试试这个。

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

}

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

  }

答案 1 :(得分:2)

可能你需要将jQuery.ajax的traditional道具设置为true才能实现traditional style of param序列化

在文档就绪之后立即将下面的代码放在

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

This如此问题可能对您有所帮助

答案 2 :(得分:1)

我会确保你的模型上有[Serializable]属性。另外,请确保您的请求指定party = {myjson}。

答案 3 :(得分:1)

您只需在控制器中声明一个类'SearchParty',即可在控制器中检索强类型对象而无需序列化。

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

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

请检查此link

答案 4 :(得分:1)

我通过修改javascript ajax调用来解决我的错误:

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

我需要对ajax调用中发送的整个数据对象进行字符串化,而不仅仅是&#39; party&#39;对象