如何将JSON字符串化模型序列化为ASP.NET MVC3模型

时间:2012-10-20 16:18:06

标签: c# asp.net-mvc json

我在MVC 3网站上有以下片段。

型号:

public class Item1
{
    [Display(Name = "Family name")]
    public string FamilyName { get; set; }

    [Display(Name = "Given name")]
    public string GivenName { get; set; }
}

控制器方法:

public string SaveAsIs(string form_section11)
{
    //  method 1 works
    var viewModel = new JavaScriptSerializer().Deserialize<IDictionary<string, object>>(form_section11);

    //  method 2 gives empty viewModel2
    var viewModel2 = new JavaScriptSerializer().Deserialize<Item1>(form_section11);

    //  method 3 gives empty item1
    Mapper.CreateMap<IDictionary<string, object>, Item1>();
    Item1 item1 = Mapper.Map<IDictionary<string, object>, Item1>(viewModel);

}

我发回的价值是代表我的模型的JSON.stringified结构。字符串(为便于阅读而列出)显示为:

"{
\"item1.FamilyName\":\"Smith\",
\"item1.GivenName\":\"Jane\"
}"

我想要做的是将字符串化的JSON转换为我的模型,但除了上面的两次尝试之外无法看到如何做或写我自己的序列化器: - (

其他一切都很好。任何人都有任何其他想法。感谢。

更新1

感谢Darin我有一个部分解决方案,即在使用item1.之前删除JavaScriptSerializer。奇怪的是item1。当使用强类型模型时,由Razor,MVC 3等添加。无论如何,我现在有一个解决方案 - 谢谢。

更新2

在回答下面的Darin问题时,Item1是我模型中的一个实体。该模型看起来像:

public class ItemModel
{
    public Item1 item1 {get; set;}
    public Item2 item2 {get; set;}
}

该视图使用@model ItemModel,字段为@Html.EditorFor(m => m.item1.FamilyName)。这两个实体在同一个屏幕上有不同的形式,我将它们作为

返回
 var form_section1Data = JSON.stringify($("#form_section1").formParams()); //item1
 var form_section1Data = JSON.stringify($("#form_section1").formParams()); //item2

并且Ajax调用包含:

data: JSON.stringify({ 
    form_section1: form_section1Data,
    form_section2: form_section2Data
}),

我简化了最初的问题(试图提供帮助: - ))

1 个答案:

答案 0 :(得分:4)

在属性名称中使用.并不常见。我们假设您有以下javascript对象:

var item = { familyName: 'Smith', givenName: 'Jane' };

以及以下控制器操作:

[HttpPost]
public ActionResult SaveAsIs(Item1 model)
{
    ...
}

现在发送AJAX请求非常简单:

$.ajax({
    url: '@Url.Action("SaveAsIs")',
    type: 'POST',
    contentType: 'application/json;charset=utf-8',
    data: JSON.stringify(item),
    success: function (result) {

    }
});

这将在POST请求正文中发送以下有效内容:

{"familyName":"Smith","givenName":"Jane"}

如您所见,属性名称中没有点。它们存在问题,因为ASP.NET MVC用于反序列化JSON请求的默认JavaScriptSerializer无法轻松配置为使用模型的不同属性名称。如您所知,您不能在.NET对象的属性名称中包含点。

另一方面,如果您绝对需要在属性名称中包含此JSON有效内容,则可以使用custom value provider factory编写JSON.NET,这样您就可以使用自定义属性修饰视图模型属性可以覆盖他们的名字。