在Windows MVC 3中将JSON反序列化为没有默认构造函数的对象
发布时间:2020-12-14 04:30:58 所属栏目:Windows 来源:网络整理
导读:关于 JSON反序列化有很多问题,但是很多问题似乎都适用于MVC 1或MVC 2.我似乎没有找到一个特别适合MVC 3的令人满意的答案. 我有一个具有不可变属性的对象,没有默认构造函数,我想在ASP.NET MVC 3应用程序中反序列化.这是一个简化版本: public class EmailAddr
关于
JSON反序列化有很多问题,但是很多问题似乎都适用于MVC 1或MVC 2.我似乎没有找到一个特别适合MVC 3的令人满意的答案.
我有一个具有不可变属性的对象,没有默认构造函数,我想在ASP.NET MVC 3应用程序中反序列化.这是一个简化版本: public class EmailAddress { public EmailAddress(string nameAndEmailAddress) { Name = parseNameFromNameAndAddress(nameAndEmailAddress); Address = parseAddressFromNameAndAddress(nameAndEmailAddress); } public EmailAddress(string name,string address) { Guard.Against<FormatException>(!isNameValid(name),"Value is invalid for EmailAddress.Name: [{0}]",name); Guard.Against<FormatException>(!isAddressValid(address),"Value is invalid for EmailAddress.Address: [{0}]",address); Name = name; Address = address; } public string Address { get; private set; } public string Name { get; private set; } // Other stuff } 示例控制器操作可能是: [HttpPost] public ActionResult ShowSomething(EmailAddress emailAddress) { return View(emailAddress) } 进入的JSON是: {"Address":"joe@bloggs.com","Name":"Joe Bloggs"} 在MVC3中进行反序列化的最佳方法是什么?有没有办法实现可以处理这个的自定义模型绑定器或反序列化器类? 一个不干扰对象本身的解决方案将是更可取的(即,一个单独的反序列化器类,而不是向属性添加属性等),尽管可以接受任何好的建议. 我在这里找到了一个类似的问题(没有答案):Can I deserialize to an immutable object using JavascriptSerializer? 解决方法
是的,您可以编写自定义模型绑定器: public class EmailAddressModelBinder : DefaultModelBinder { protected override object CreateModel(ControllerContext controllerContext,ModelBindingContext bindingContext,Type modelType) { var addressKey = "Address"; var nameKey = "Name"; if (!string.IsNullOrEmpty(bindingContext.ModelName)) { addressKey = bindingContext.ModelName + "." + addressKey; nameKey = bindingContext.ModelName + "." + nameKey; } var addressValue = bindingContext.ValueProvider.GetValue(addressKey); var nameValue = bindingContext.ValueProvider.GetValue(nameKey); if (addressValue == null || nameValue == null) { throw new Exception("You must supply an address and name"); } return new EmailAddress(nameValue.AttemptedValue,addressValue.AttemptedValue); } } 将在Application_Start中注册: ModelBinders.Binders.Add(typeof(EmailAddress),new EmailAddressModelBinder()); 最后剩下的就是调用动作: $.ajax({ url: '@Url.Action("ShowSomething")',type: 'POST',data: JSON.stringify({ "Address": "joe@bloggs.com","Name": "Joe Bloggs" }),contentType: 'application/json',succes: function (result) { alert('success'); } }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- active-directory – 已修改GPO的事件ID
- 在Windows上使用Git
- 配置NTFS文件系统以提高性能
- powershell – NTFS格式的可移动存储,通过命令行安全地删除
- webpack’不是内部命令,也不是可运行程序或批处理文件(wi
- microsoft-cognitive – LUIS:已添加具有相同密钥的项目
- 在Windows下的java中,如何找到重定向的Desktop文件夹?
- remote-desktop – 使用远程桌面时Windows资源管理器(文件名
- windows-8 – 找不到名称/密钥AppBarButtonStyle的资源
- 如何在Windows Powershell中信任证书