【问题标题】:FluentValidation/MVC/ASP Identity: How to get the current user Id when validating model?FluentValidation/MVC/ASP Identity:验证模型时如何获取当前用户 ID?
【发布时间】:2014-04-03 09:02:19
【问题描述】:

1) 我正在尝试允许用户在 ASP.MVC/Identity 应用程序中更改其用户名(电子邮件)等。使用 FluentValidation 我想检查没有其他用户正在使用新电子邮件。

在控制器中我会使用 User.Identity.GetUserId() 但这在构建验证规则时不可用。如何检索当前已通过身份验证的 userId?

public class ManageUserViewModelValidator : AbstractValidator<ManageUserViewModel>
{
    public ManageUserViewModelValidator()
    {
        RuleFor(e => e.UserName)
            .NotEmpty()
            .WithMessage("Måste ange din e-post adress.")
            .EmailAddress()
            .WithMessage("Ogiltig e-post adress.")
            .Must((model, _) => UserMethods.IsUserNameAvailable(model.UserName, "userId???"))
            .WithMessage("E-post adressen är upptagen.");
    }

    ...

}

[FluentValidation.Attributes.Validator(typeof(ManageUserViewModelValidator))]
public class ManageUserViewModel
{
    [Display(Name = "E-post*")]
    public string UserName { get; set; }

    ...
}

2) 存储此类更改的最佳方式是什么。现在我正在使用 AutoMapper:

public static void Update(this DbContext context, ManageUserViewModel model, string userId)
    {
        User user = context.Users.FirstOrDefault(e => e.Id.Equals(userId));
        Mapper.CreateMap<ManageUserViewModel, TessinUser>();
        Mapper.Map(model, user);
        context.SaveChanges();
    }

3) 在我的标题中,我使用User.Identity.GetUserName() 显示当前登录的用户,但是在我更改了用户名之后,此文本没有更新。我需要注销并再次登录才能更新。有没有办法让 ASP 更新当前用户?

【问题讨论】:

    标签: asp.net-mvc automapper asp.net-identity fluentvalidation


    【解决方案1】:

    1) 我正在尝试允许用户在 ASP.MVC/Identity 应用程序中更改其用户名(电子邮件)等

    Asp.net 身份有一个名为UserManager 的类。这个类公开了很多函数,包括Update,它会自动更新用户在UserStore中的数据。

    使用 FluentValidation 我想检查没有其他用户正在使用新电子邮件。

    如果您使用 UserManager 类的 Create 函数来创建新用户,则此函数会自动处理重复的用户名条目验证。如果输入无效或重复,Create 函数会返回描述性很好的错误消息,您可以将这些消息显示给您的用户。

    2) 存储此类更改的最佳方式是什么。现在我正在使用 AutoMapper:

    我不明白您在 2 点中提到的代码。 Automapper 的唯一目的是将一个对象映射到另一个对象。在那个代码中

    • 您从数据库中获取用户
    • 创建一个映射配置(你应该只做一次,不需要一次又一次地创建映射配置。所以这种类型的东西最好的地方是 global.asax 文件)
    • 然后您将视图模型对象映射到域模型对象。

    但是这个东西从来没有对当前上下文进行任何改变,所以context.SaveChanges()没有任何作用。

    我认为这就是您的 User.Identity.GetUserName() 未更新的原因。

    【讨论】:

    • 谢谢,我会试试 Update() 可能会解决我所有的问题。感谢您阐明映射配置的放置位置。
    • 我已经使用 UpdateAsync 完成了所有步骤,但我的 User.Identity.GetUserName() 没有更新?这可以以某种方式强制吗?
    • 您是否使用 ajax 更新用户?
    • 不使用后端控制器。
    • 好的,但我的意思是说您通过哪种方式将请求发送到控制器,ajax 请求或表单发布?因为如果它是一个ajax而不是用户名文本不会更新,你必须手动更新文本用户名
    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2016-08-27
    • 2019-03-24
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多