ASP.NET MVC自定义成员资格提供程序 – 如何重载CreateUser?

我正在尝试构建自定义成员资格提供程序。 我想在注册期间捕获其他信息(名字和姓氏),我不使用用户名(电子邮件是登录名)。

在我的自定义成员资格提供程序中,我正在尝试重载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方法?

谢谢!

不是很明显吗? 当您调用Membership.CreateUser时,您引用的是Membership,而不是MyMembershipProvider。

看起来Membership是一个内部调用你的成员资格提供者的静态类,所以除了创建你自己的“MyMembership”静态类做同样的事情之外,没有其他方法可以改变它。 由于您无法从静态类inheritance,因此您必须从静态版本调用Membership.XXX,或者自己实现该function。

您自己的MyMembership课程可以拥有您希望它拥有的任何方法。

另一个选择是做这样的事情:

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

我不喜欢这种方法,因为它要求你记住调用提供者CreateUser而不是Membership.CreateUser。 另外,铸造通常是代码气味(除非封装,这就是我推荐你自己的MyMembership静态类的原因)。

这里的问题是成员资格提供程序类没有给你一个名字和姓氏。 但是,您可以将它们存储在配置文件中。 在这种情况下,您需要进入AccountController.cs类并更改1.接口

    公共接口IMembershipService
     {
         int MinPasswordLength {get;  }

         bool ValidateUser(string userName,string password);
         MembershipCreateStatus CreateUser(字符串userName,字符串密码,字符串电子邮件);
         bool ChangePassword(string userName,string oldPassword,string newPassword);
     }

并添加一个新的CreateUser方法签名与您想要的字段。

然后,您需要在该文件的AccountController类中实现此方法。

你在下面提到的文章说:

 “但是,成员类或依赖Membership类的控件(例如CreateUserWizard控件)不会调用此重载。要从应用程序调用此方法,请将Membership类引用的MembershipProvider实例强制转换为自定义成员资格提供程序键入,然后直接调用CreateUseroverload。“

所以 – 你不能调用内置的CreateUser,因为他们提到尝试在新的CreateUser方法中转换调用

 public MembershipCreateStatus CreateUser(string firstName,string lastName,string password,string email)
         {
             if(String.IsNullOrEmpty(password))抛出新的ArgumentException(“Value不能为null或为空。”,“password”);
             if(String.IsNullOrEmpty(email))抛出新的ArgumentException(“Value不能为null或为空。”,“email”);
 //等等....
             MembershipCreateStatus状态;
 ((YourCustomProvider)_provider).CreateUser(firstName,lastName,password,email,null,null,true,null,out status); 返回状态;
         }