2015-02-23 45 views
0

我的模型中有以下實體。使用AJAX在MVC中發送到控制器時,嵌套javascript對象屬性爲空

public class Provider 
{ 
    public int ProviderId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string SSN { get; set; } 
    public string NPI { get; set; } 
    public ProviderDetails ProviderDetails { get; set; } 

} 

public class ProviderDetails 
{ 
    public int ProviderDetailsId { get; set; } 
    public string Certification { get; set; } 
    public string Specialization { get; set; } 
    public string TaxonomyCode { get; set; } 
    public string ContactNumber { get; set; } 
    public string ContactEmail { get; set; } 
    public int ProviderId { get; set; } 
} 

我有以下控制器操作方法。

[HttpPost] 
    public ActionResult CreateProvider(Provider provider) 
    { 
     try 
     { 
      int providerCreationSuccessful = _repository.CreateProvider(provider); 
      if (providerCreationSuccessful == 1) 
       TempData["userIntimation"] = "Provider Registered Successfully"; 

      return RedirectToAction("ShowTheListOfProviders"); 
     } 
     catch (Exception Ex) 
     { 
      _logger.Error(Ex.Message); 
      return View("Error"); 
     } 
    } 

我正在使用AJAX發送數據到控制器,如圖所示。

self.createProviderDetails = function() { 
    $.ajax({ 
     url: "/Provider/CreateProvider/", 
     type: "POST", 
     data: fillModel(), 
     async: false, 
     success: function (result) { 
      if (result.url) { 
       location.href = result.url; 
      } 
     } 
    }).fail(
      function (xhr, textStatus, err) { 
       alert(err); 
      }); 
}; 

fillmodel功能是

var fillModel = function() { 
    var providerData = 
     { 
      ProviderId: self.providerID(), 
      FirstName: self.firstName(), 
      LastName: self.lastName(), 
      SSN: self.SSN(), 
      NPI: self.NPI(), 
      ProviderDetails: { 
       ProviderDetailsId: 0, 
       Certification: self.certification(), 
       Specialization: self.specialization(), 
       TaxonomyCode: self.taxonomyCode(), 
       ContactNumber: self.contactNumber(), 
       ContactEmail: self.contactEmail(), 
       ProviderId: self.providerID()   
      } 
     } 
    return providerData; 
} 

的對象數據是在使用Javascript側,但在控制器細,如這裏示出的嵌套對象爲空。

enter image description here

請讓我知道,至於我在做什麼wrong.I現在無法推測這一個。

+1

內容類型:應用程序/ JSON它添加到Ajax請求 – sakir 2015-02-23 11:57:47

+1

的'DefaultModelBinder'將正確綁定,如果名稱是按以下格式'ProviderDetails.ProviderDetailsId :0,ProviderDetails.Certification:someValue'等(點符號)。但是,如果你的屬性使用強類型助手構造你的視圖,你所需要的只是'data:$(yourForm).serialize(),' – 2015-02-23 12:06:09

回答

1

傳遞列和屬性的相同名稱,然後傳遞到模型,然後應該是可見的,你的模型,當你進入控制器,

data: JSON.stringify({ 
    model: { 
       "Column1": $("#Column1").val(), 
       "Column2": $("#Column2").val(), 
       "Column3": $("#Column3").val(), 
       "Column4": $("#Column4").val(), 
      }), 

,並通過這樣的模式,因爲上次有發現這種類型的問題,那麼我已經通過這個固定的。

+0

那麼嵌套模型呢?那就是null。 – 2015-02-23 12:05:40

+0

需要同樣的實現,在下面的column4中創建嵌套模型,並映射相同的名稱模型以及它應該通過的列名稱,如果提出相同的問題,請注意您的編碼。 – 2015-02-23 12:09:24

+0

如果我這樣做,或者需要AJAX代碼中的某些更改,我應該更改控制器嗎? – 2015-02-23 12:10:41

0
self.createProviderDetails = function() { 
     $.ajax({ 
      url: "/Provider/CreateProvider/", 
      type: "POST", 
      data: fillModel(), 
      async: false, 
datatype : "json", 
      contentType: "application/json; charset=utf-8", 
      success: function (result) { 
       if (result.url) { 
        location.href = result.url; 
       } 
      } 
     }).fail(
       function (xhr, textStatus, err) { 
        alert(err); 
       }); 
    }; 
0

爭取你的AJAX請求爲「JSON」指定dataType

self.createProviderDetails = function() { 
    $.ajax({ 
     url: "/Provider/CreateProvider/", 
     type: "POST", 
     data: fillModel(), 
     dataType: "json", // specify data type 
     async: false, 
     success: function (result) { 
      if (result.url) { 
       location.href = result.url; 
      } 
     } 
    }).fail(
      function (xhr, textStatus, err) { 
       alert(err); 
      }); 
}; 
0

另一個非常常見的錯誤是方括號[]。在構建嵌套對象時要小心。

var object = { 
    NestedObject: [{ Column1: "value1" }], //error 
    NestedObject: { Column1: "value1" }, // Good. 
} 

是沒有區別的,如果你使用的名稱的列的報價和嵌套列:

var object = { 
    "NestedObject": { "Column1": "value1" }, // Good. 
} 

你必須在你的控制對象。但無論如何,最重要的是指定的數據類型:JSON

$.ajax({ 
    url: "/Provider/CreateProvider/", 
    type: "POST", 
    data: fillModel(), 
    dataType: "json", // specify data type JSON 
    success: function (result) { 

    } 
}) 
相關問題