ASP.. NET MVC自定义成员提供程序-如何重载CreateUser

本文关键字:何重载 重载 CreateUser 程序 MVC NET 自定义 成员 ASP | 更新日期: 2023-09-27 17:53:44

我正在尝试构建自定义会员提供程序。我想在注册期间捕获额外的信息(名和姓),我不使用用户名(电子邮件是登录)。

在我的自定义会员提供程序中,我试图像这样重载CreateUser方法:

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

但是当我想从Account控制器调用它时:

    [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);
    }

我得到错误说明"No overload for method takes 4个参数"。

如何从自定义会员提供程序类调用自定义CreateUser方法?

谢谢!

ASP.. NET MVC自定义成员提供程序-如何重载CreateUser

这不是很明显吗?当你调用Membership. createuser时,你引用的是Membership,而不是MyMembershipProvider。

看起来会员制是一个静态类,内部调用你的会员资格提供程序,所以没有真正的方法来改变这一点,除了创建自己的"MyMembership"静态类做同样的事情。由于不能从静态类继承,因此必须调用到Membership。XXX,或者自己实现这些功能。

你自己的MyMembership类可以有任何你想要的方法。

另一个选项是这样做:

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

我不喜欢这种方法,因为它要求你记住调用提供者CreateUser而不是member .CreateUser。另外,强制类型转换通常是一种代码气味(除非封装,这就是为什么我建议您自己的MyMembership静态类)。

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

<>之前公共接口membershipservice{int MinPasswordLength {get;}bool ValidateUser(字符串用户名,字符串密码);CreateUser(字符串用户名,字符串密码,字符串电子邮件);bool ChangePassword(字符串userName,字符串oldPassword,字符串newPassword);}之前

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

那么你需要在该文件的AccountController类中实现这个方法。

你下面提到的文章说:

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

所以-你不能像他们提到的那样调用内置的CreateUser尝试将新的CreateUser方法中的调用转换为

<>之前public MembershipCreateStatus CreateUser(字符串firstName,字符串lastName,字符串password,字符串email){if (String.IsNullOrEmpty(password))抛出新的ArgumentException("Value不能为空或null .", "password");if (String.IsNullOrEmpty(email))抛出新的ArgumentException("值不能为空或null .", "email");//等等……MembershipCreateStatus状态;((YourCustomProvider) _provider)。CreateUser(firstName, lastName, password, email, null, null, true, null, out status);返回状态;}