2

我希望能够使用 WebAPI 2 公开用户列表。但是,由于我在 MVC5 中使用新的 Asp.Net 身份验证框架,我似乎无法找到仅将特定字段标记为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定义的IdentityUser.

这里有任何提示或解决方法吗?我宁愿不必创建 ViewModel,除非这是当前的最佳实践。

4

3 回答 3

3

我知道这是一个老问题,当我试图实现同样的目标时,我偶然发现了它。这就是我最终做的事情。您可以覆盖您的属性并将它们标记为 [JsonIgnore] 以便它们不会自动序列化。

public class ApplicationUser : IdentityUser
    {
        public UserType UserType { get; set; }

        [JsonIgnore]
        public override string PasswordHash
        {
            get { return base.PasswordHash; }
            set { base.PasswordHash = value; }
        }
    }
于 2017-02-06T13:04:55.110 回答
2

您可能应该只发送一个包含您需要的用户信息的不同对象,而不是序列化用户对象。

于 2013-10-22T17:02:02.513 回答
1

你想用什么格式化程序?我没有看到默认 Json 格式化程序有任何问题。但是对于 xml 序列化程序,它也需要基类是 DataContract。

视图模型在这里始终是最佳实践,尽管为简单起见,大多数 web api 示例都使用数据实体。这两个模型是不同的关注点。视图模型代表你的 api 的契约,数据模型代表你的领域概念。将两种模型合二为一可能会影响您的设计决策,甚至更严重的是,可能会导致安全问题。使用数据实体可能会将意外数据暴露给用户。例如,不同的格式化程序有不同的规则来控制模型的曝光。JsonIgnore 在 xml 格式化程序中不起作用。如果您有自定义格式化程序,它将更加复杂。特别是对于身份用户实体,它具有许多敏感属性,如密码哈希、安全标记。我不建议您将其公开。

顺便说一句,有许多映射器工具可以帮助简化从域模型到视图模型的映射。您可能需要它们:http ://www.nuget.org/packages?q=mapper

于 2013-10-22T17:08:55.360 回答