gpt4 book ai didi

asp.net-mvc - MVC 是否不会对实现 IEnumerable 的模型上的其他属性进行 json 序列化?

转载 作者:行者123 更新时间:2023-12-02 01:22:39 25 4
gpt4 key购买 nike

我不知道为什么我现在才第一次注意到这种行为。希望确认这是否是设计行为,或者我是否遗漏了某些内容。

假设我有一个实现 IEnumerable<T> 的 View 模型,并提供附加属性。例如:

public class MyResultsViewModel : IEnumerable<MyResultViewModel>
{
public IEnumerable<MyResultViewModel> Results { get; set; }
public string SomeAdditionalProperty { get; set; }

public IEnumerator<MyResultViewModel> GetEnumerator()
{
return Results.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator; }
}

假设我还有一个 Controller ,它以 json 形式返回此模型。例如:

public ActionResult MyResults()
{
var entities = PrivateMethodToGetEntities();
var models = Mapper.Map<MyResultsViewModel>(entities);
models.SomeAdditionalProperty = "I want this in the JSON too";
return Json(models, JsonRequestBehavior.AllowGet);
// models now contains a populated Results as well as the add'l string prop
}

当我从客户端上的 JSON 请求返回结果时,它总是以数组形式返回。例如:

$.get('/Path/To/MyResults')
.success(function (results) {
alert(results.SomeAdditionalProperty); // this alerts 'undefined'
alert(results.length); // this alerts the size / count of Results
alert(results[0]); // this alerts object
// inspecting results here shows that it is a pure array, with no add'l props
});

在我重构以使 View 模型不实现之前 IEnumerable<T> ,我想得到一些确认,这是设计使然,应该是预期的。我想这是有道理的,因为 javascript 数组对象的原型(prototype)必须扩展以适应其他属性。

更新:

我对 View 模型进行了以下更改,以避免命名内部枚举 Results :

public class MyResultsViewModel : IEnumerable<MyResultViewModel>
{
public IEnumerable<MyResultViewModel> NotNamedResults { get; set; }
public string SomeAdditionalProperty { get; set; }

public IEnumerator<MyResultViewModel> GetEnumerator()
{
return NotNamedResults.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator; }
}

经过此更改,该行为仍然存在。 alert(JSON.stringify(results))为我的 MyResultViewModel 枚举集合生成正常的数组语法s:

[{"ResultProp1":"A","ResultProp2":"AA","ResultProp3":"AAA"},{"ResultProp1":"B","ResultProp2":"BB","ResultProp3":"BBB"},{"ResultProp1":"C","ResultProp2":"CC","ResultProp3":"CCC"},{"ResultProp1":"D","ResultProp2":"DD","ResultProp3":"DDD"},{"ResultProp1":"E","ResultProp2":"EE","ResultProp3":"EEE"}]

在 Controller 操作返回 JsonResult 之间,附加属性似乎仍然丢失。和 jquery success函数被调用。

最佳答案

对于实现 IEnumerable 的类,JavascriptSerializer仅序列化枚举项。它调用GetEnumerator()为了使数据被序列化,任何其他属性都将被忽略。这就是为什么 Count List<T> 的属性没有序列化,任何其他属性也不会。

原因是这种类型的构造无法用json格式表示。要包含其他属性,序列化程序必须创建哈希对象而不是数组,但严格来说,哈希对象不是集合。 (异常(exception)是像 Dictionary 这样的键/值对类,它们被序列化为哈希对象。但规则仍然有效 - 只有枚举的字典条目被序列化)。

但是为什么要创建一个实现 IEnumerable 的类直接序列化为json而不是这样做?

 public class MyResultsViewModel {
public IEnumerable<MyModel> Models{ get; set; }
public String SomeAdditionalData { get; set; }
}

关于asp.net-mvc - MVC 是否不会对实现 IEnumerable<T> 的模型上的其他属性进行 json 序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11905346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com