Dav*_*ett 4 json deserialization asp.net-mvc-3
关于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
}
Run Code Online (Sandbox Code Playgroud)
示例控制器操作可能是:
[HttpPost]
public ActionResult ShowSomething(EmailAddress emailAddress)
{
return View(emailAddress)
}
Run Code Online (Sandbox Code Playgroud)
进入的JSON是:
{"Address":"joe@bloggs.com","Name":"Joe Bloggs"}
Run Code Online (Sandbox Code Playgroud)
在MVC3中进行反序列化的最佳方法是什么?有没有办法实现可以处理这个的自定义模型绑定器或反序列化器类?
一个不干扰对象本身的解决方案将是更可取的(即,一个单独的反序列化器类,而不是向属性添加属性等),尽管可以接受任何好的建议.
我在这里找到了一个类似的问题(没有答案):我可以使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
将在Application_Start中注册:
ModelBinders.Binders.Add(typeof(EmailAddress), new EmailAddressModelBinder());
Run Code Online (Sandbox Code Playgroud)
最后剩下的就是调用动作:
$.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');
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4134 次 |
| 最近记录: |