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

C# ASP.NET MVC自定义成员资格提供程序-如何重载CreateUser?,c#,asp.net-mvc-3,asp.net-membership,membership-provider,overloading,C#,Asp.net Mvc 3,Asp.net Membership,Membership Provider,Overloading,我正在尝试建立自定义成员资格提供程序。我想在注册过程中捕获其他信息(名字和姓氏),但我不使用用户名(电子邮件是登录) 在我的自定义成员资格提供程序中,我试图重载CreateUser方法,如下所示: public override MyMembershipUser CreateUser(string firstName, string lastName, string email, string passwor

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

在我的自定义成员资格提供程序中,我试图重载CreateUser方法,如下所示:

    public override MyMembershipUser CreateUser(string firstName, string lastName, 
                                       string email, string password)
    {
        ...
    }
((MyMembershipProvider)Membership.Provider).CreateUser()
但当我想从账户控制员那里打电话时:

    [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方法


谢谢大家!

这里的问题是成员资格提供程序类没有提供您的名字和姓氏。但是,您可以将这些存储在配置文件中。 在这种情况下,您需要进入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); } 公共接口IMembershipService { int MinPasswordLength{get;} bool ValidateUser(字符串用户名、字符串密码); MembershipCreateStatus CreateUser(字符串用户名、字符串密码、字符串电子邮件); bool ChangePassword(字符串用户名、字符串旧密码、字符串新密码); } 并添加一个新的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. " 但是,成员类或依赖成员类的控件(如CreateUserWizard控件)不会调用此重载。若要从应用程序调用此方法,请将成员类引用的MembershipProvider实例强制转换为自定义成员资格提供程序类型,然后调用CreateUseroverload direc" 因此-您不能调用他们提到的内置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; } public MembershipCreateStatus CreateUser(字符串firstName、字符串lastName、字符串密码、字符串电子邮件) { if(String.IsNullOrEmpty(password))抛出新的ArgumentException(“值不能为null或空。”,“password”); if(String.IsNullOrEmpty(email))抛出新的ArgumentException(“值不能为null或空。”,“email”); //等等。。。。 成员资格和状态; ((YourCustomProvider)\u provider.CreateUser(firstName、lastName、密码、电子邮件、null、null、true、null、out状态);返回状态; }
这不是很明显吗?调用Membership.CreateUser时,您引用的是成员资格,而不是MyMembershipProvider

看起来Membership是一个静态类,在内部调用您的成员资格提供程序,所以除了创建您自己的“MyMembership”静态类来做同样的事情之外,没有其他真正的方法来改变这一点。由于不能从静态类继承,因此必须从静态版本调用Membership.XXX,或者自己实现该功能

然后,您自己的MyMembership类可以拥有您想要的任何方法

另一种选择是这样做:

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

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

我正在尝试使用custom MembershipUser实现自定义成员资格提供程序,以便能够在其中存储名字和姓氏。我不想使用配置文件提供程序。我想重载CreateUser方法,如“修改CreateUser方法”段落中所示。该示例没有显示如何从控制器中调用此方法,我认为这是我所缺少的。啊,好的-我编辑了上面的答案,因为您不需要配置文件PropertyTanks。根据Mystere Man的答案得出。我认为你之前(编辑前)的答案更切题。从MSDN:但是,成员类或依赖成员类的控件(如CreateUserWizard控件)不会调用此重载。要从应用程序调用此方法,请将成员资格类引用的MembershipProvider实例强制转换为自定义成员资格提供程序类型,然后直接调用CreateUseroverload。“。我如何将MembershipProvider实例强制转换为我的自定义成员资格提供程序类型?是的,您可以强制转换MembershipProvider实例,但不能强制转换成员资格静态类。我试图在编辑中澄清这一点。太好了。非常感谢!您忘记了“覆盖”“在CreateUser方法上。此外,这是一个关于定义整个自定义成员资格提供程序的优秀教程。干杯谢谢我在别人的帮助下解决了这个问题。有趣的是,这个链接实际上是我的博客和教程;)认真地哇,如果是那样的话,谢谢你,伙计。该教程是我第一次尝试使用表单身份验证!这对我帮助很大。非常感谢。@LukeP这是一篇很棒的文章,但在Models/AccountModels.cs文件中出错错误是错误1无法将类型“System.Web.Security.MembershipProvider”隐式转换为“MvcMembership.Models.MyMembershipProvider”。存在显式转换(是否缺少演员阵容?@ashuthinks我相信教程是为MVC 2编写的,我相信您现在会使用MVC 3。几乎没有什么变化。你能提出一个新的问题并准确地提到哪一行代码失败了吗?我仍然得到了源代码。我会试着调查一下。