ASP.NET Поставщик пользовательского членства в MVC — Как перегрузить CreateUser?

#c# #asp.net-mvc-3 #asp.net-membership #membership-provider #overloading

#c# #asp.net-mvc-3 #asp.net-членство #поставщик членства #перегрузка

Вопрос:

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

В моем пользовательском поставщике членства я пытаюсь перегрузить метод 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 аргумента».

Как мне вызвать мой пользовательский метод CreateUser из пользовательского класса поставщика членства?

Спасибо!

Комментарии:

1. Вы забыли «переопределить» метод CreateUser. Кроме того, это отличное руководство по определению всего вашего поставщика пользовательского членства. Приветствия!

2. Спасибо. Я разобрался с этим с некоторой помощью. Забавно, но ссылка на самом деле является моим блогом и моим руководством 😉

3. Серьезно! Вау, в таком случае, миллион благодарностей, приятель. В этом руководстве я впервые попытался даже попробовать использовать аутентификацию в формах! Это мне очень помогло. Большой долг.

4. @LukeP ОТЛИЧНАЯ СТАТЬЯ, НО ПРИ ПОЛУЧЕНИИ ОШИБКИ В файле Models / AccountModels.cs ошибка 1 Не удается неявно преобразовать тип ‘System.Web.Security. MembershipProvider’ to ‘MvcMembership. Модели. MyMembershipProvider’. Существует явное преобразование (вам не хватает приведения?)

5. @ashuthinks Я полагаю, что руководство было написано для MVC 2, и я полагаю, что сейчас вы использовали бы MVC 3. Несколько вещей изменилось. Можете ли вы открыть новый вопрос и указать, в какой именно строке кода происходит сбой? Я все еще получил исходный код. Я попытаюсь разобраться в этом.

Ответ №1:

Разве это не очевидно? При вызове Membership вы ссылаетесь на Membership, а не на MyMembershipProvider.Создайте пользователя.

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

Тогда ваш собственный класс MyMembership мог бы иметь любые методы, которые вы хотели, чтобы он имел.

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

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

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

Комментарии:

1. Я думаю, что ваш предыдущий (предварительно отредактированный) ответ был более по существу. Из MSDN: «Однако эта перегрузка не будет вызвана классом членства или элементами управления, которые полагаются на класс членства, такими как элемент управления CreateUserWizard. Чтобы вызвать этот метод из приложения, приведите экземпляр MembershipProvider, на который ссылается класс Membership, в качестве вашего пользовательского типа поставщика членства, а затем вызовите ваш CreateUseroverload напрямую. «. Как мне привести экземпляр MembershipProvider в качестве моего пользовательского типа поставщика членства?

2. Да, вы можете привести экземпляр MembershipProvider, но не статический класс членства. Я пытался прояснить это в своей правке.

Ответ №2:

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

 общедоступный интерфейс IMembershipService
 { 
 int MinPasswordLength { get; }

 bool ValidateUser(строковое имя пользователя, строковый пароль);
 MembershipCreateStatus CreateUser (строковое имя пользователя, строковый пароль, строковый адрес электронной почты);
 bool ChangePassword(строка userName, строка oldPassword, строка NewPassword);
 }

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

Затем вам нужно будет реализовать этот метод в классе AccountController в этом файле.

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

"Однако эта перегрузка не будет вызвана классом членства или элементами управления, которые полагаются на класс членства, такими как элемент управления CreateUserWizard. Чтобы вызвать этот метод из приложения, приведите экземпляр MembershipProvider, на который ссылается класс Membership, в качестве типа вашего пользовательского поставщика членства, а затем напрямую вызовите CreateUseroverload. "

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

общедоступный MembershipCreateStatus CreateUser (строковое имя, строковая фамилия, строковый пароль, строковый адрес электронной почты)
 { 
 если (строка.IsNullOrEmpty(пароль)) выдает новое исключение ArgumentException ("Значение не может быть нулевым или пустым.", "пароль");
 если (строка.IsNullOrEmpty(email)) выдает новое исключение ArgumentException ("Значение не может быть нулевым или пустым.", "email");
// и т.д....
 Статус MembershipCreateStatus;
((YourCustomProvider)_provider).CreateUser (имя, фамилия, пароль, электронная почта, null, null, true, null, статус выхода); статус возврата; 
 }

Комментарии:

1. Я пытаюсь реализовать пользовательский поставщик членства с пользовательским MembershipUser, чтобы иметь возможность сохранять в нем имя и фамилию. Я не хочу использовать поставщика профилей. Я хочу перегрузить метод CreateUser, как показано в: msdn.microsoft.com/en-us/library/ms366730(v=VS.100).aspx в абзаце «Изменить метод CreateUser». В примере не показано, как этот метод вызывается из контроллера, который, я думаю, является тем, чего мне не хватает.

2. ах, хорошо — я отредактировал ответ выше, так как вам не нужно свойство profile

3. Спасибо. Понял это из ответа Mystere Man.