FluentValidation / MVC / ASP Identity:验证模型时如何获取当前用户ID?

时间:2014-03-02 12:46:43

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

1)我试图允许用户在ASP.MVC / Identity应用程序中更改其UserName(电子邮件)等。使用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()显示当前登录的用户,但在我更改了UserName后,此文本未更新。我需要注销并再次登录才能更新。有没有办法让ASP更新当前用户?

1 个答案:

答案 0 :(得分:2)

  

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

Asp.net标识有一个名为UserManager的类。这个类公开了许多函数,包括Update,它将自动更新UserStore中的用户数据。

  

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

如果您使用UserManager类的Create功能来创建新用户,则此功能会自动关注重复的用户名条目验证。如果无效或重复输入,Create函数会返回您可以向用户显示的描述性错误消息。

  

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

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

  • 您从数据库中获取用户
  • 创建映射配置(你应该只做一次这样的事情,不需要一次又一次地创建映射配置。所以这类事物的最佳位置是global.asax文件)
  • 然后将viewmodel对象映射到域模型对象。

但是这个东西从未在当前上下文中进行任何更改,因此 context.SaveChanges()无效。

我认为这就是为什么你的User.Identity.GetUserName()没有更新的原因。