我希望能够使用WebAPI 2公开用户列表。但是,由于我在MVC5中使用新的Asp.Net身份验证框架,我似乎无法找到仅将特定字段标记为{的方法{1}}。
继承我所拥有的:
DataMembers
但是,这似乎不起作用,因为[DataContract]
public class ApplicationUser : IdentityUser {
public Nullable<DateTime> birthday { get; set; }
[DataMember]
public int tolerance { get; set; }
[DataMember]
public string twitter { get; set; }
}
没有IdentityUser
属性。我已尝试创建自定义[DataContract]
,但在创建IdentityUser
的自定义副本后,我无法构建。
这里有任何提示或解决方法吗?我不想创建一个ViewModel,除非这是当前的最佳实践。
答案 0 :(得分:2)
您可能应该使用您需要的用户信息发送不同的对象,而不是序列化用户对象。
答案 1 :(得分:2)
我知道这是一个老问题,当我试图达到同样的目的时,我偶然发现了它。这就是我最终做的事情。您可以覆盖您的属性并将其标记为[JsonIgnore],以便它们不会自动序列化。
public class ApplicationUser : IdentityUser
{
public UserType UserType { get; set; }
[JsonIgnore]
public override string PasswordHash
{
get { return base.PasswordHash; }
set { base.PasswordHash = value; }
}
}
答案 2 :(得分:1)
您想使用哪种格式化程序?我没有看到默认的Json格式化程序有任何问题。但对于xml序列化程序,它还需要基类为DataContract。
视图模型始终是最佳实践,尽管为了简单起见,web api的大多数示例都使用数据实体。这两个模型是各自关注的问题。 View模型代表api的合约,数据模型代表您的域概念。将两个模型合二为一会影响您的设计决策,甚至更严重,可能会导致安全问题。使用数据实体可能会将意外数据暴露给用户。例如,不同的格式化程序具有不同的规则来控制模型的曝光。 JsonIgnore在xml格式化程序中不起作用。如果你有自定义格式化程序会更复杂。特别是对于身份用户实体,它具有许多敏感属性,如pasword hash,security stamp。我不建议你公开它。
BTW,有许多映射器工具可以帮助简化从域模型到视图模型的映射。您可能需要它们:http://www.nuget.org/packages?q=mapper