ASP.net MVC不会在http帖子中反序列化一个类

时间:2012-01-25 14:45:22

标签: c# asp.net-mvc

我有这个控制器:

public JsonResult Register(string step , GlobalOnBoardingDataModel data){}

MVC不会反序列化data变量。 step变量将post var变为它。

我有其他被反序列化的类很好,但是这个不会。 这是班级:

public class GlobalOnBoardingDataModel : BaseStepDataModel
    {
        public string Email = string.Empty;
        public string FirstName = string.Empty;
        public string LastName = string.Empty;
        public string PhoneAreaCode = string.Empty;
        public string PhoneCountryCode = string.Empty;
        public string PhoneNumber = string.Empty;
        public string CountryShortName = string.Empty;
        public string AccountCurrency = string.Empty;
        public float InitialDepositAmount = 0;
        public string Address = string.Empty;
        public string City = string.Empty;
        public string State = string.Empty;
        public string DateOfBirth = string.Empty;
        public string CreditCardNumber = string.Empty;
        public string CreditCardExperationDate = string.Empty;
        public bool RiskDisclosure = false;
        public bool Beneficiary = false;
        public string CVVNumber = string.Empty;
        public bool Subscribe = false;
    }

BTW,var的位置不是问题,与其他情况一起工作的第二位。

修改 这些是值(来自chrome):

step:one
FirstName:kjh
LastName:
CountryShortName:IL
PhoneNumber:
PhoneAreaCode:
PhoneCountryCode:
Email:Test@test.com

由于

1 个答案:

答案 0 :(得分:2)

假设邮政体是正确的;您需要重写字段并将其转换为public get/set属性。

MVC不会模拟绑定到字段。

由于您希望成员拥有非默认默认值;你可以使用默认的ctor来设置构造的属性默认值;虽然我更喜欢不使用自动实现属性的方法:

private string _email = string.Empty; 
public string Email { get { return _email; } set { _email = value } } 

实际上,我认为在运行时几乎没有什么区别 - 但是如果你使用构造函数方法,那么在添加新属性时很容易忘记为它添加一个新的默认值。

MVC最终不会绑定到字段,因为它以循环方式使用System.ComponentModel.TypeDescriptor类来获取用于标识要绑定的模型属性的元数据。这不是一个错误,但它是设计上的并且是一个很好的设计选择,因为它使除反射之外的机制能够用于描述模型类型。