2015-02-23 46 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) { 

    } 
}) 
相关问题