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); 返回状态; }