Атрибут проверки Custon MVC3 с использованием двух свойств - PullRequest
1 голос
/ 20 февраля 2012

Я пытаюсь написать собственный класс проверки, который подтверждает, что электронная почта еще не используется. Для этого у меня есть метод, который подсчитывает профили пользователей, которые имеют адрес электронной почты в вопросе. Достаточно просто, но если пользователь обновляет свой профиль, мне нужно исключить его профиль из числа, о котором я упоминал. Для этого я написал следующий метод:

public static bool IsEmailUnique(string email, int userprofileId)
{
    int count = -1;

    using (var db = new TRDataContext())
    {
        count = (from u in db.Userprofiles
                 where u.email == email &&
                       (userprofileId == 0 || u.userprofile_id != userprofileId)
                 select u).Count();
    }

    return count == 0;
}

Это хорошо работает в пользовательском классе валидатора для новых пользователей, так как все, что мне нужно сделать, это передать 0 в userprofile_id.

public class EmailValidatorAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        if (value == null)
            return false;

        return Userprofile.IsEmailUnique(value.ToString(), 0);
    }
}

и реализовано так

[DisplayName("Email Address")]
[Required(ErrorMessage = "Required")]
[RegularExpression(EmailRegex, ErrorMessage = "Invalid email address")]
[EmailValidator(ErrorMessage = "Already in use")]
public string email { get; set; }

Однако теперь мне нужно передать в EmailValidator userprofile_id этого текущего пользователя. Мне трудно разобраться с этим.

Любая помощь будет принята с благодарностью.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

У меня была похожая проблема.Сначала я реализовал метод CurrentUser в своем пользовательском репозитории, который выглядит примерно так:

        //Gets the current user
        public U_USER CurrentUser()
        {
            return GetUser(HttpContext.Current.User.Identity.Name);
        }

        public U_USER GetUser(string u)
        {
            return (from us in db.U_USER
                    where us.UserName == u
                    select us).FirstOrDefault();
        }

Затем вы можете использовать его для получения идентификатора из вашего атрибута валидации, как показано ниже:

public class EmailValidatorAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        using(UserRepository ur = new UserRepository())
        {
           if (value == null)
               return false;

           var user = ur.CurrentUser();
           return Userprofile.IsEmailUnique(value.ToString(), user.userprofile_id);
        }
    }
}
2 голосов
/ 20 февраля 2012

Вы можете получить это из HttpContext:

string currentUsername = HttpContext.Current.User.Identity.Name;

, и, прежде чем меня приговорят за предложение использования HttpContext.Current в методе, вы можете использовать провайдера:

public class EmailValidatorAttribute : ValidationAttribute
{
    public Func<HttpContextBase> ContextProvider = () => new HttpContextWrapper(HttpContext.Current);

    public override bool IsValid(object value)
    {
        if (value == null)
            return false;

        string currentUsername = ContextProvider().User.Identity.Name;

        ...
    }
}

, который теперь можно легко смоделировать в модульном тесте.

...