使用 AJAX 发送到 MVC 中的控制器时,嵌套的 javascript 对象属性为空
Nested javascript object properties are null when sent to the controller in MVC using AJAX
我的模型中有以下实体。
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);
});
};
填充模型函数是
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 端没有问题,但在控制器中,嵌套对象为空,如此处所示。
请让我知道,至于我在做什么wrong.I我想不通。
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);
});
};
尝试将 AJAX 请求的 dataType
指定为 'json':
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);
});
};
传递相同名称的列和属性,然后传递到模型中,然后在传递到控制器时应该在模型中可见,
data: JSON.stringify({
model: {
"Column1": $("#Column1").val(),
"Column2": $("#Column2").val(),
"Column3": $("#Column3").val(),
"Column4": $("#Column4").val(),
}),
并像这样传递模型,因为上次发现了这种类型的问题,然后我已经解决了这个问题。
另一个非常常见的错误是方括号 []。构建嵌套对象时要小心。
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) {
}
})
我的模型中有以下实体。
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);
});
};
填充模型函数是
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 端没有问题,但在控制器中,嵌套对象为空,如此处所示。
请让我知道,至于我在做什么wrong.I我想不通。
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);
});
};
尝试将 AJAX 请求的 dataType
指定为 'json':
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);
});
};
传递相同名称的列和属性,然后传递到模型中,然后在传递到控制器时应该在模型中可见,
data: JSON.stringify({
model: {
"Column1": $("#Column1").val(),
"Column2": $("#Column2").val(),
"Column3": $("#Column3").val(),
"Column4": $("#Column4").val(),
}),
并像这样传递模型,因为上次发现了这种类型的问题,然后我已经解决了这个问题。
另一个非常常见的错误是方括号 []。构建嵌套对象时要小心。
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) {
}
})