C# 首先以编程方式打开.NET EF代码上的属性序列化
我在EF 6上使用CodeFirst对数据进行建模。 我正在构建一个Web API,不同类型的客户端可以访问该API,但根据客户端的配置,他们应该看到或不看到模型的某些属性 ?如何打开或关闭C# 首先以编程方式打开.NET EF代码上的属性序列化,c#,asp.net,entity-framework,asp.net-web-api,asp.net-web-api2,C#,Asp.net,Entity Framework,Asp.net Web Api,Asp.net Web Api2,我在EF 6上使用CodeFirst对数据进行建模。 我正在构建一个Web API,不同类型的客户端可以访问该API,但根据客户端的配置,他们应该看到或不看到模型的某些属性 ?如何打开或关闭[JsonIgnore]或[serialized]?是否可以设置一组特定的规则来执行此操作,如验证程序?选项1:使用自定义ContractResolver 您可以创建自定义合同解析程序,并在创建响应时使用它: public class TestContractResolver : DefaultContrac
[JsonIgnore]
或[serialized]
?是否可以设置一组特定的规则来执行此操作,如验证程序?选项1:使用自定义ContractResolver
您可以创建自定义合同解析程序,并在创建响应时使用它:
public class TestContractResolver : DefaultContractResolver
{
public string ExcludeProperties { get; set; }
protected override IList<JsonProperty> CreateProperties(Type type,
MemberSerialization memberSerialization)
{
if (!string.IsNullOrEmpty(ExcludeProperties))
return base.CreateProperties(type, memberSerialization)
.Where(x => !ExcludeProperties.Split(',').Contains(x.PropertyName))
.ToList();
return base.CreateProperties(type, memberSerialization);
}
}
结果是:
{"Id":1,"LastName":"y"}
{"Id":1,"LastName":"y"}
选项2:使用字典
您可以忽略一个逗号分隔的属性名称字符串,然后选择属性并将其(名称和值)放入字典中,并将其用作结果:
[HttpGet]
public Dictionary<string, Object> Test()
{
var person = new Person() { Id = 1, FirstName = "x", LastName = "y", Age = 20 };
string excludeProperties = "FirstName,Age";
var dictionary = new Dictionary<string, Object>();
person.GetType().GetProperties()
.Where(x => !excludeProperties.Split(',').Contains(x.Name)).ToList()
.ForEach(p =>
{
var key = p.Name;
var value = p.GetValue(person);
dictionary.Add(key, value);
});
return dictionary;
}
如何获得模型的json表示;Add(新的JsonMediaTypeFormatter());config.Formatters.JsonFormatter.SerializerSettings.ContractResolver=新的CamelCasePropertyNamesContractResolver()代码>我正在考虑一种使用数据注释的方法,但我认为使用一个被排除属性的对象序列化到用户声明中,然后将其作为字符串传递给契约将是一个更干净的解决方案。我已经忘了存在一个合同解决者。谢谢,完成了。再次感谢:D
{"Id":1,"LastName":"y"}