moving mvc5 account controller code to separate project

不问归期 提交于 2019-12-11 05:27:57

问题


I have a solution that contains a WebApi2,MVC5 & DAL project (all RTM).

I am wanting to use the new membership bits that are now baked-in, but I don't like all the account stuff being all in the account controller. Doing a file new project (asp.net) has all of the membership stuff coupled to the account controller.

Within my DAL I am using EF6 as I like the ideal of code-first as it suits what I am trying to do. I am trying to take the account controller code and move it into my separate project.

My context within the DAL is nice and simple (taken from the MVC site)

public class ApplicationUser : IdentityUser
{
    //a user can belong to multiple stores
    public virtual ICollection<StoreModel> Stores { get; set; }
}


public class DataContext : IdentityDbContext<ApplicationUser>
{
    public DataContext(): base("name=DefaultConnection")
    {
    }
    public DbSet<Business> Businesses { get; set; }
    public DbSet<ConsumerModel> Consumers { get; set; }
    public DbSet<StoreModel> Stores { get; set; }
}

From my account controller within my login actionresult I try

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
  if (ModelState.IsValid)
     {
      var user = await UserManager.FindAsync(model.UserName, model.Password);
       if (user != null)
       {

It throws an error with User.FindAsync

The entity type ApplicationUser is not part of the model for the current context.

What do I need to do to allow ApplicationUser to be used in the current context?


回答1:


I have done something similar. In order to implement separation of concerns, I fetch the UserManager from my Repository and then use it in the Presentation layer. Repository internally creates the UserManager from UserStore using the internal LoginDbContext. That way, the DbContext and Store are separated from the controller.




回答2:


If you create WebApi project or somthing with VisualStudio template,

please carefully see UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); in Startup.Auth.cs file.

You might miss (new ApplicationDbContext()) part. By default, it has empty parameter.




回答3:


You need to create a UserManager which takes in the userstore which takes in your dbcontext

public UserController()
        : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
    {
    }


    public UserManager<ApplicationUser> UserManager { get; private set; }

    public UserController(UserManager<ApplicationUser> userManager)
    {
        UserManager = userManager;
    }



回答4:


I believe this will help. I am pretty new to MVC5 and I have been wanting to separate my model layer from my MVC website, mainly because I imagine I will want to share the models across my various projects. I have been unable to follow all the programming mumbo jumbo I have found on the various help sites. I always end up with a lot of errors which I am unable to resolve with my limited knowledge. However, I have found an easy way to move my ApplicationDbContext out of my MVC5 model and with hardly any errors. All the work is done by the wizards already provided by Microsoft. I would like to share my little find with everyone. This is what you do (step by step):

1.  Create a MVC5 project with authentication. Call it ModelProject.
2.  Exclude everything from the project except
    a.  Properties
    b.  References
    c.  Models
    d.  packages.config

3.  The ModelProject will hold all your models (even ApplicationDbContext.) Rebuild it.
4.  Now, create a new MVC5 project with authentication. Call this Mvc5Project
5.  Import the ModelProject project into Mvc5Project .
6.  Wire the ModelProject into this project i.e. link in the reference.
7.  Exclude the following from the MVc5Project from the Models folder
    a.  AccountViewModels.cs
    b.  IdentityModels.cs
    c.  ManageViewModels.cs
8.  If you rebuild now, you will get a bunch of errors. Just go to the errors and resolve them using the right click method to get the new namespace from ModelProject. The namespace will show if you have wired the project in correctly.
9.  Also, dont forget to go to View/Manage and Views/Account of Mvc5Project and change the models in there to the new location otherwise you will get some weird cryptic errors.

That's it! Now you have a project with the models all separated out (including the applicationDbContext) -And NO ERRORS!! Good luck!



来源:https://stackoverflow.com/questions/19489527/moving-mvc5-account-controller-code-to-separate-project

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!