【问题标题】:Creating a new member programmatically in Umbraco在 Umbraco 中以编程方式创建新成员
【发布时间】:2015-01-07 13:05:32
【问题描述】:

我正在尝试以编程方式为我的 Umbraco 网站创建一个新成员,但我不确定我是否正确执行此操作。

我的代码如下所示:

 MemberType demoMemberType = new MemberType(1040); //id of membertype ‘demo’
 Member newMember = Member.MakeNew(newEmployee.FirstName + " " + newEmployee.LastName, demoMemberType, new umbraco.BusinessLogic.User(0));

 newMember.Email = "test@testmail.com";
 newMember.Password = "password";
 newMember.LoginName = "Test";
 newMember.getProperty("firstName").Value = "test";

 newMember.Save();

但是当我运行我的代码时,我的 Umbraco 中看不到任何东西。有人可以告诉我我做错了什么吗?

【问题讨论】:

    标签: c# model-view-controller umbraco


    【解决方案1】:

    如果您使用 umbraco 7,最好使用会员服务。以下是您可以用来实现此目的的简单方法。

    请注意 ApplicationContext 对于 8+ 的新 umbraco 版本不再存在,所以请忽略它。其他一切正常。

    public int RegisterMember(string memberName, string emailAddress, string memberPassword, string memberTypeAlias, string memberGroupName)
    {
            int umbracoMemberId = -1;
    
            if (!MemberExists(emailAddress))
            {
                IMember newMember = ApplicationContext.Current.Services.MemberService.CreateMember(emailAddress, emailAddress, memberName, memberTypeAlias);
    
                try
                {
                    ApplicationContext.Current.Services.MemberService.Save(newMember);
                    ApplicationContext.Current.Services.MemberService.SavePassword(newMember, memberPassword);
                    ApplicationContext.Current.Services.MemberService.AssignRole(newMember.Id, memberGroupName);
                    umbracoMemberId = newMember.Id;
                }
                catch (Exception ex)
                {
                    throw new Exception("Unable to create new member " + ex.Message);
                }
            }
    
            return umbracoMemberId;
    }
    
    
    public bool MemberExists(string emailAddress)
    {
            return (ApplicationContext.Current.Services.MemberService.GetByEmail(emailAddress) != null);
    }
    

    对于更真实的 v8 方法,您需要完全放弃 ApplicationContext,而使用如下的依赖注入引擎。此示例假设您无法在这种情况下通过构造函数注入依赖项IMemeberService,因此至少从我目前所遇到的情况来看,对于大多数人来说应该涵盖大多数情况,尤其是对于那些使用 umbraco 开发应用程序的人

    public int RegisterMember(string memberName, string emailAddress, string memberPassword, string memberTypeAlias, string memberGroupName)
    {
            int umbracoMemberId = -1;
    
            if (!MemberExists(emailAddress))
            {
                try
                {
    
                    IMemberService _memberService = Current.Factory.GetInstance<IMemberService>();
    
                    IMember newMember = _memberService.CreateMember(body.Email, body.Email, celebName, "Member");
    
                    _memberService.Save(newMember);
                    _memberService.SavePassword(newMember, body.Password);
                    _memberService.AssignRole(newMember.Id, CMSContentConstants.RootNodes.gGourpAliasCelebrityMember);
    
                    umbracoMemberId = newMember.Id;
                }
                catch (Exception ex)
                {
                    throw new Exception("Unable to create new member " + ex.Message);
                }
            }
    
            return umbracoMemberId;
    }
    

    【讨论】:

      【解决方案2】:

      这个主题非常复杂,但以下是您的模型和控制器的一些代码,应该让您走上正轨。希望您对 MVC 有足够的了解来完成这项工作。

      您的模型可能包含以下内容,并使用来自您的视图的输入进行填充

          using System.ComponentModel.DataAnnotations;
          using System.Web;
      
          namespace MyProject.Models
          {
              public class MemberModel 
              {
      
                  [Required]
                  public string Name { get; set; }
      
                  [Required]
                  [EmailAddress]
                  public string Email { get; set; }
      
                  [Required]
                  public string Password { get; set; }
              }
      }
      

      您的控制器可能如下所示:

      using System.Web.Mvc;
      using MyProject.Models;
      using Umbraco.Web.Mvc;
      
      namespace MyProject.Controllers
      {
          public class MemberController : SurfaceController
          {
              public ActionResult SignUp(MemberModel model)
              {
                  if (!ModelState.IsValid) 
                      return CurrentUmbracoPage();
      
                  var memberService = Services.MemberService;
                  if (memberService.GetByEmail(model.Email) != null)
                  {
                      ModelState.AddModelError("", "Member already exists");
                      return CurrentUmbracoPage();
                  }
                  var member = memberService.CreateMemberWithIdentity(model.Email, model.Email, model.Name, "MyMemberType");
      
                  memberService.Save(member);
      
                  memberService.SavePassword(member,model.Password);
      
                  Members.Login(model.Email, model.Password);
      
                  return Redirect("/");
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        根据 Umbraco 版本,提供的代码示例已经过时。

        Umbraco 4 将 Umbraco 成员模型更改为使用 ASP.NET Membership Provider 模型,意思是所有的抽象类 提供开箱即用的 ASP.NET 能够访问 Umbraco 会员。 MSDN 上有很多很好的资源(以及其他 网站)使用 ASP.NET 成员资格,建议的起点是 在这里。

        文章:

        http://our.umbraco.org/wiki/how-tos/membership-providers

        http://msdn.microsoft.com/en-us/library/tw292whz.aspx

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-19
          • 1970-01-01
          • 2016-08-12
          • 1970-01-01
          • 2017-04-07
          相关资源
          最近更新 更多