Web API - 从模型返回一些字段

时间:2015-10-16 12:41:14

标签: c# asp.net asp.net-web-api2 asp.net-web-api

我有这个模特:

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忽略此字段(问题)。所以,我有一个动作,返回序列化的测验没有问题。我必须执行另一个操作,该操作将返回所有字段(包括问题)。我怎样才能做到这一点 ?我需要两个动作。

3 个答案:

答案 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