1

我的 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
}),

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

4

1 回答 1

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 factoryusing JSON.NET,它允许您使用可以覆盖其名称的自定义属性来装饰您的视图模型属性。

于 2012-10-20T16:26:38.920 回答