我有这个模特:
public class Quiz
{
public int Id { get; set; }
public string Title { get; set; }
public int CurrentQuestion { get; set; }
[JsonIgnore]
public virtual ICollection<Question> Questions { get; set; }
}
有[JsonIgnore]
告诉JSON Serializer忽略此字段(问题)。所以,我有一个动作,返回序列化的测验没有问题。我必须执行另一个操作,该操作将返回所有字段(包括问题)。我怎样才能做到这一点 ?我需要两个动作。
答案 0 :(得分:3)
最好不要从API返回您的域模型。更好的方法是创建视图模型类并返回它们。
因此,在您的示例中,您只需创建:
public class QuizViewModel
{
public int Id { get; set; }
public string Title { get; set; }
public int CurrentQuestion { get; set; }
}
并使用它从API返回数据。
显然,在一些较大的类中,复制所有属性的代码将是噩梦,但不要担心 - Automapper(http://automapper.org/)来救援! :)
//Best put this line in app init code
Mapper.CrateMap<Quiz, QuizViewModel>();
//And in your API
var quiz = GetSomeQuiz();
return Mapper.Map<QuizViewModel>(quiz);
然后以相同的方式创建另一个带有“问题”字段的视图模型类。
答案 1 :(得分:2)
您需要稍微更改一下代码,尽管它非常简单:)
[Serializable]
public class Quiz
{
public int Id { get; set; }
public string Title { get; set; }
public int CurrentQuestion { get; set; }
}
[Serializable]
public class QuizWithQuestions : Quiz
{
public ICollection<Question> Questions { get; set; }
}
现在,如果您想要包含问题集合,请使用QuizWithQuestions
类。
答案 2 :(得分:0)
我遇到了类似的问题。我的解决方案是:
默认情况下,我有DBContext,禁用LazyLoading:
Questions
因此,所有导航属性(如NULL
)都将为 config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling
= Newtonsoft.Json.ReferenceLoopHandling.Ignore;
config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling
= Newtonsoft.Json.NullValueHandling.Ignore;
。然后在我的WebAPIConfig中配置formatter来隐藏空值:
repository.SwitchLazyLoading(true);
当我需要模型中所有字段的结果时,我只需打开控制器中的LazyLoading:
public void SwitchLazyLoading(bool value)
{
this.context.Configuration.LazyLoadingEnabled = value;
}
存储库中的方法:
[JsonIgnore]
我不使用[IgnoreDataMember]
我只使用#!/usr/bin/env python
import os
from subprocess import Popen, PIPE
working_dir = b"/home/MTS/Dropbox/dir/In_Files"
for filename in os.listdir(working_dir):
print("Performing calculations on {filename!r}...".format(**vars()))
p = Popen(["run_command.command", "-f", "a"], cwd=working_dir, stdin=PIPE)
p.communicate(input=b"\n".join([b"1", filename, b"4"]))
if p.returncode != 0: # non-zero exit status may indicate failure
raise Error
请查看Switches for LazyLoading with Repository pattern