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

MSDN Article

请尝试此解决方案。这不是最好的,但它会解决你的问题。 从 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
     }