使用MVC模板将用户添加到控制器之外的角色

时间:2015-10-29 13:09:52

标签: asp.net-mvc

我使用标准MVC模板,可以愉快地创建用户并将其添加到我的控制器中的角色。

我的问题是我可以从我的某个模型中做到这一点吗?

澄清我想将新用户逻辑从我的控制器移到我的UserSetting类

控制器:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Create(UserSettingsViewModel model)
    {
        if (ModelState.IsValid)
        {
          UserSetting userSetting = new UserSetting(model);
            UserSetting.Create(userSetting);
       }
       }

我的用户设置类:

public class UserSetting : Controller 
{

    private ApplicationUserManager _userManager;

    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

    public static void Create(UserSetting userSetting)
    {
        switch (userSetting.AccountType)
        {
            // InternalUser
            case 0:

                AddOrUpdateInternalUser(userSetting);

                break;
            // ExternallUser
            case 1:
                AddOrUpdateExternalUser(userSetting);
                break;
            // InternaDoctor
        }

    }

    public async void AddOrUpdateInternalUser(UserSetting userSetting)
    { 

    var db = new V2Context();

    db.UserSettings.AddOrUpdate(userSetting);

      await UserManager.RemoveFromRolesAsync(userSetting.UserName, UserManager.GetRoles(userSetting.UserName).ToString());
      await  UserManager.AddToRolesAsync(userSetting.UserName, "newrole");

    db.SaveChanges();

    }

}

1 个答案:

答案 0 :(得分:0)

老实说,你的代码对我来说并不是太糟糕,至少在简洁的意义上。控制器应该负责处理数据库这样的事情,所以我不认为你需要抽象出任何一个。你可以通过在辅助类上调用一个方法将三行代码转换成一行,但从长远来看,这确实有什么不同吗?不,事实上,有人可能会说你实际上正在添加复杂性,这样你现在必须在两个地方而不是一个地方看,只是为了移出这么少量的代码

此外,如果您要将此代码移出到帮助程序类,那么您还需要将上下文注入其中。许多开发人员在尝试在另一个类中创建其上下文时犯了致命的错误,这只会导致问题。

就个人而言,我只是试着保持我的动作方法很轻,并在控制器上创建受保护的方法,这些动作可以用来完成繁重的工作。这与Microsoft在其示例代码中遵循的身份相同。长和短,将代码保留在控制器中,除非有一个特别好的理由将其移出。

如果您的操作过于繁重,请在控制器上将代码重构为私有/受保护的方法(取决于您是否关心能够将控制器子类化)。然后,如果您有适用于多个控制器的代码,请将其分解为每个可以使用的辅助类。