C# 可选参数未与 Ajax 的 json 数据正确映射(具有不同类型的相同名称)
C# optional parameter not properly mapped with json data of Ajax(with same name of different types)
json ajax 的数据参数与 c# 方法的可选参数不正确匹配
$.ajax({
url: '/CusotmerManagement/Cusotmer/GetCusotmerByDisplayId/',
dataType: 'json',
data: {
displayId: selectedCustomerRow.DisplayId,
transportationModeName: selectedCustomerRow.TransportationModeName,
jagurRef: jaguarDetails
},
contentType: "application/json; charset=utf-8",
success: function (data) {
//some code
}
});
在上面的 ajax 调用中,我 省略了可选参数 (class CustomerSelectorResult ) 并且我重要地传递了所有其他参数 displayId (主要客户的)。因为我没有次要客户,所以我省略了 CustomerSelectorResult(注意:CustomerSelectorResult 也有 DisplayId )
C# 方法
public JsonResult GetCusotmerByDisplayId(string displayId, string transportationModeName, int jagurRef, CustomerSelectorResult alternatePickUpCarrier = null)
{
//my logic
}
但是在 C# 方法中,CustomerSelectorResult 中的 displayId 和 DisplayId 具有相同的值,即使 CustomerSelectorResult 是可选参数。
CustomerSelectorResult class
public class CustomerSelectorResult
{
public string Name { get; set; }
public string DisplayId { get; set; }//note display id within CustomerSelectorResult
public int RoleId { get; set; }
public string RoleName { get; set; }
public AddressResult Address { get; set; }
}
为什么可选参数的DisplayId取主参数(displayId)的值??
注意:我通过将值显式传递为 CustomerSelectorResult 克服了这个问题:null.
提前致谢。
所有这些魔法都称为 MVC 模型绑定。
如果 CustomerSelectorResult
在您的请求中不为空,则默认模型绑定将尝试根据您的请求构建它,并会在您的请求中找到 displayId
。
请尝试此解决方案。这不是最好的,但它会解决你的问题。
从 DefaultModelBinder
创建新的 class
public class CustomerSelectorResultModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var data = base.BindModel(controllerContext, bindingContext);
var model = data as CustomerSelectorResult;
//check if CustomerSelectorResult's all properties are null except DisplayId.
if(model != null &&
model.Name == null &&
model.RoleId == default(int) &&
model.RoleName == null &&
model.Address == null)
{
return null;
}
return data;
}
}
并将此 class 应用到您的操作中
public JsonResult GetCusotmerByDisplayId(string displayId, string transportationModeName, int jagurRef, [ModelBinder(typeof(CustomerSelectorResultModelBinder))]CustomerSelectorResult alternatePickUpCarrier = null)
{
//my logic
}
json ajax 的数据参数与 c# 方法的可选参数不正确匹配
$.ajax({
url: '/CusotmerManagement/Cusotmer/GetCusotmerByDisplayId/',
dataType: 'json',
data: {
displayId: selectedCustomerRow.DisplayId,
transportationModeName: selectedCustomerRow.TransportationModeName,
jagurRef: jaguarDetails
},
contentType: "application/json; charset=utf-8",
success: function (data) {
//some code
}
});
在上面的 ajax 调用中,我 省略了可选参数 (class CustomerSelectorResult ) 并且我重要地传递了所有其他参数 displayId (主要客户的)。因为我没有次要客户,所以我省略了 CustomerSelectorResult(注意:CustomerSelectorResult 也有 DisplayId )
C# 方法
public JsonResult GetCusotmerByDisplayId(string displayId, string transportationModeName, int jagurRef, CustomerSelectorResult alternatePickUpCarrier = null)
{
//my logic
}
但是在 C# 方法中,CustomerSelectorResult 中的 displayId 和 DisplayId 具有相同的值,即使 CustomerSelectorResult 是可选参数。
CustomerSelectorResult class
public class CustomerSelectorResult
{
public string Name { get; set; }
public string DisplayId { get; set; }//note display id within CustomerSelectorResult
public int RoleId { get; set; }
public string RoleName { get; set; }
public AddressResult Address { get; set; }
}
为什么可选参数的DisplayId取主参数(displayId)的值??
注意:我通过将值显式传递为 CustomerSelectorResult 克服了这个问题:null
提前致谢。
所有这些魔法都称为 MVC 模型绑定。
如果 CustomerSelectorResult
在您的请求中不为空,则默认模型绑定将尝试根据您的请求构建它,并会在您的请求中找到 displayId
。
请尝试此解决方案。这不是最好的,但它会解决你的问题。
从 DefaultModelBinder
public class CustomerSelectorResultModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var data = base.BindModel(controllerContext, bindingContext);
var model = data as CustomerSelectorResult;
//check if CustomerSelectorResult's all properties are null except DisplayId.
if(model != null &&
model.Name == null &&
model.RoleId == default(int) &&
model.RoleName == null &&
model.Address == null)
{
return null;
}
return data;
}
}
并将此 class 应用到您的操作中
public JsonResult GetCusotmerByDisplayId(string displayId, string transportationModeName, int jagurRef, [ModelBinder(typeof(CustomerSelectorResultModelBinder))]CustomerSelectorResult alternatePickUpCarrier = null)
{
//my logic
}