加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

在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?

解决方法

Is there some way of implementing a custom model binder or
deserializer class that can handle this?

是的,您可以编写自定义模型绑定器:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读