免责声明:此方法目前基于Orchard 1.10,但最初是在1.9.x分支上开发的。它不依赖于动态表单和工作流,但我认为您可以通过这些模块实现类似的功能。
好的,所以我用我们的扩展用户/激活系统方法构建了一个示例模块。我去掉了很多代码,但也让一些与你的答案没有直接关系的有趣部分加入其中。
首先,您应该查看
UsersController
它有您正在搜索的激活动作。您可能需要扩展果园登录视图,并包含一些GET&相应的POST操作。
[AllowAnonymous]
[HttpGet]
public ActionResult Activate(string activationCode)
{
// validation stuff....
var viewModel = new CustomUserActivate
{
// This is the activationCode you're looking for
ActivationCode = userFromActivationCode.ActivationCode,
UserName = userFromActivationCode.User.UserName,
WelcomeText = userFromActivationCode.WelcomeText,
Email = userFromActivationCode.User.Email
};
return this.View(viewModel);
}
[AllowAnonymous]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Activate(CustomUserActivate input)
{
if ( input == null )
{
this.ModelState.AddModelError("_form", this.T("The argument cannot be null").Text);
}
CustomUserPart customUserPart = null;
if ( this.ModelState.IsValid )
{
customUserPart = this.myService.GetCustomUserByActivationCode(input.ActivationCode);
if ( customUserPart == null || customUserPart.User == null || customUserPart.User.UserName != input.UserName )
{
this.notifier.Add(NotifyType.Error, this.T("The activation failed"));
}
if ( string.IsNullOrEmpty(input.Email) )
{
this.ModelState.AddModelError("Email", this.T("You must specify an email address.").Text);
}
else if ( input.Email.Length >= 255 )
{
this.ModelState.AddModelError("Email", this.T("The email address you provided is too long.").Text);
}
else if ( !Regex.IsMatch(input.Email, UserPart.EmailPattern, RegexOptions.IgnoreCase) )
{
// http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx
this.ModelState.AddModelError("Email", this.T("You must specify a valid email address.").Text);
}
else if ( !this.myService.VerifyEmailUnicity(customUserPart.User.Id, input.Email) )
{
this.ModelState.AddModelError("Email", this.T("This email address is already in use.").Text);
}
}
if ( !this.ModelState.IsValid )
{
return this.View(input);
}
Debug.Assert(customUserPart != null, "customUserPart != null");
var user = customUserPart.User;
var userParams = new CreateUserParams(user.UserName, input.Password, input.Email, passwordQuestion: null, passwordAnswer: null, isApproved: true);
this.myService.ActivateCustomUser(customUserPart.Id, userParams);
this.notifier.Add(NotifyType.Information, this.T("Your account was activated. You can now log in."));
return this.RedirectToAction("LogOn", "Account", new { area = "Orchard.Users" });
}
有趣的事情发生在
MyService.cs
.
我们设计了激活系统,以便您仍然可以利用Orchard的所有功能。用户模块,如电子邮件验证。
为此,我们实施了一些
CustomSettings
,您可以决定在使用ActivationCode时用户是否被完全激活,或者是否触发正常的Orchard机制。
我想最好是签出模块并在VisualStudio中逐步完成代码。
这里是我们的激活视图的两个屏幕截图。
步骤1-输入激活码
第2步-填写剩余字段
利润
所有额外的源代码都是在工作流、事件、令牌等中使用CustomUser/ActivationCode。但我将这一点留给您去发现。
如果你想更详细地描述GitHub上的源代码,请告诉我。
希望这有帮助!