我正在尝试构建自定义成员资格提供程序。我想在注册过程中捕获其他信息(名字和姓氏),我不使用用户名(电子邮件是登录名)。
在我的自定义成员资格提供程序中,我正在尝试重载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个参数”。
如何从Custom Membership Provider类调用我的自定义CreateUser方法?
谢谢!
答案 0 :(得分:4)
不是很明显吗?当您调用Membership.CreateUser时,您将引用Membership,而不是MyMembershipProvider。
看起来Membership是一个静态类,它在内部调用你的成员资格提供者,所以除了创建你自己的“MyMembership”静态类做同样的事情之外,没有其他方法可以改变它。由于您无法从静态类继承,因此您必须从静态版本调用Membership.XXX,或者自己实现该功能。
你自己的MyMembership课程可以拥有你想要的任何方法。
另一种选择是做这样的事情:
((MyMembershipProvider)Membership.Provider).CreateUser()
我不喜欢这种方法,因为它要求你记得调用提供者CreateUser而不是Membership.CreateUser。另外,铸造通常是代码气味(除非封装,这就是为什么我推荐你自己的MyMembership静态类)。
答案 1 :(得分:1)
此处的问题是成员资格提供程序类没有为您提供名字和姓氏。但是,您可以将它们存储在配置文件中。 在这种情况下,您需要进入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; }