ASP.NET MVC Custom Member Provider - Как перегрузить CreateUser? - PullRequest
2 голосов
/ 30 апреля 2011

Я пытаюсь создать пользовательский членства.Я хотел бы получить дополнительную информацию (имя и фамилию) во время регистрации, и я не использую имена пользователей (адрес электронной почты является логином).

В моем пользовательском поставщике членства я пытаюсь перегрузить метод CreateUserкак это:

    public override MyMembershipUser CreateUser(string firstName, string lastName, 
                                       string email, string password)
    {
        ...
    }

Но когда я хочу вызвать его из контроллера учетной записи:

    [HttpPost]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            // Attempt to register the user
            MembershipCreateStatus createStatus;
            Membership.CreateUser(model.FirstName, model.LastName, 
                                  model.Email, model.Password);

            if (createStatus == MembershipCreateStatus.Success)
            {
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError("", ErrorCodeToString(createStatus));
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

я получаю сообщение об ошибке, гласящее, что «Нет перегрузки для метода принимает 4 аргумента».1009 *

Как мне вызвать мой пользовательский метод CreateUser из класса Custom Membership Provider?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 30 апреля 2011

Разве это не очевидно?При обращении к Membership.CreateUser вы ссылаетесь на членство, а не на MyMembershipProvider.

Похоже, что Membership - это статический класс, который внутренне вызывает вашего провайдера членства, поэтому нет никакого реального способа изменить это, кроме создания собственного статического класса "MyMembership", который делает то же самое.Поскольку вы не можете наследовать от статических классов, вам придется либо вызвать в Membership.XXX из вашей статической версии, либо реализовать эту функцию самостоятельно.

В этом случае ваш собственный класс MyMembership может иметь любые методы, которые вам нужны.have.

Другим вариантом было бы сделать что-то вроде этого:

((MyMembershipProvider)Membership.Provider).CreateUser()

Мне не нравится этот подход, потому что он требует, чтобы вы не забывали вызывать провайдера CreateUser, а не членство.Создать пользователя.Кроме того, приведение часто является запахом кода (за исключением случаев инкапсуляции, поэтому я рекомендовал свой собственный статический класс MyMembership).

1 голос
/ 30 апреля 2011

Проблема в том, что класс поставщика членства не дает вам имя и фамилию.Вы можете сохранить их в профиле, однако.В этом случае вам нужно перейти в класс AccountController.cs и изменить 1. интерфейс

    public interface IMembershipService
    {
        int MinPasswordLength { get; }

        bool ValidateUser(string userName, string password);
        MembershipCreateStatus CreateUser(string userName, string password, string email);
        bool ChangePassword(string userName, string oldPassword, string newPassword);
    }

и добавить новую сигнатуру метода CreateUser с нужными полями.

Тогда вам потребуетсяреализовать этот метод в классе AccountController в этом файле.

В статье, о которой вы упоминаете ниже, говорится:

"However, this overload will not be called by the Membership class or controls that rely on the Membership class, such as the CreateUserWizard control. To call this method from an application, cast the MembershipProvider instance referenced by the Membership class as your custom membership provider type, and then call your CreateUseroverload directly. "

Итак, вы не можете вызвать встроенный CreateUser, как они упоминаютв вашем новом методе CreateUser будет

public MembershipCreateStatus CreateUser(string firstName, string lastName, string password, string email)
        {
            if (String.IsNullOrEmpty(password)) throw new ArgumentException("Value cannot be null or empty.", "password");
            if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", "email");
//etc....
            MembershipCreateStatus status;
((YourCustomProvider)_provider).CreateUser(firstName, lastName, password, email, null, null, true, null, out status);            return status;
        }

...