【问题标题】:ASP.net MVC wont deserialize a class in http postASP.net MVC 不会反序列化 http post 中的类
【发布时间】:2012-01-25 14:45:22
【问题描述】:

我有这个控制器:

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;
    }

顺便说一句,var 的位置不是问题,在其他情况下工作的第二个地方。

编辑 这些是值(来自 chrome):

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

谢谢

【问题讨论】:

  • 你可以使用 Fiddler2 (fiddler2.com/fiddler2) 或类似的方法来包含 HTTP POST 的正文吗?
  • 发布或设置到服务器的数据是什么?

标签: c# asp.net-mvc


【解决方案1】:

假设帖子正文是正确的;您需要重写这些字段并将它们转入public get/set 属性。

MVC 不会模型绑定到字段。

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

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

实际上,我想在运行时几乎没有区别 - 但如果您使用构造函数方法,很容易在添加新属性时忘记为其添加新的默认值。

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

【讨论】:

  • 谢谢,那么如何设置默认值以避免空异常?通过构造函数?
  • 使用明确的支持者:private string _email = string.Empty; public string Email { get { return _email; } set { _email = value } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多