控制器操作未触发-简单项目-ASP.NET MVC CORE 2.0

时间:2018-11-12 15:06:11

标签: asp.net asp.net-mvc asp.net-core-mvc entity-framework-core identity

我有一个非常简单的Web应用程序,试图让人们注册用户。因此,我尝试将用户注册数据保存到Entity Framework,但是没有运气。

由于某种原因,提交表单时未触发IActionResult RegisterUser(我尝试设置断点,没有任何反应)。谁能找到原因?

Startup.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        var connection = @"Server=(localdb)\mssqllocaldb;Database=APIExercise2;Trusted_Connection=True;ConnectRetryCount=0";
        services.AddDbContext<DataContext>(options => options.UseSqlServer(connection));
        services.AddIdentity<IdentityUser, IdentityRole>()
                                        .AddEntityFrameworkStores<DataContext>();
        services.AddMvc();
    }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseMvc(routes =>
        {
            routes.MapRoute("Default", "{controller=Account}/{action=Index}");
        });
        app.UseFileServer();
    }
}

Index.cshtml

@model CS_ConfigSettings.Models.Register

<form asp-controller="Account" asp-action="RegisterUser" method="post">
    <input asp-for="Email" type="text" name="Email" id="Email" />
    <input asp-for="Password" type="password" name="Password" id="Password" />
    <button type="submit">Submit</button>
</form>

控制器

public class AccountController : Controller
{
    private readonly UserManager<IdentityUser> _userManager;
    public AccountController(UserManager<IdentityUser> userManager)
    {
        _userManager = userManager;
    }

    public IActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public async Task<IActionResult> RegisterUser(Register register)
    {
        var user = new IdentityUser
        {
            Email = register.Email
        };

        var result = await _userManager.CreateAsync(user, register.Password);

        return View();

    }
}

Register.cs

public class Register
{
    public int Id { get; set; }

    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }
}

DataContext.cs

public class DataContext : DbContext
{
    public DbSet<Register> register { get; set; }
    public DataContext(DbContextOptions<DataContext> options) : base(options)
    {
        Database.EnsureCreated();
    }
}

提交表单时,不会触发在控制器操作RegisterUser中设置的断点,并且不会更新数据库表register

谢谢。

1 个答案:

答案 0 :(得分:1)

如此您是否意识到Identity为您创建了表?它们通常被命名为AspNetUsers,AspNetRoles,AspNetRoleUsers等等,因此创建register将是Identity永远不会使用的表。

如果先前列出的那些表不在您的数据库中创建,则您需要创建一个迁移,通常是initial迁移,它将创建所有标识表。使用PMC命令或带有dotnet的命令行。我建议您使用选择的个人用户帐户重新创建项目,以为您提供“身份”功能。

您无法使用断点来执行该方法的事实……对于UseFileServer干扰MVC的事实……总是将UseMVC()作为最后一个条目。顺序很重要。

一旦该方法被击中,它将出错,因为UserManager将由于表不存在而死亡,因为这将是新创建的用户在AspNetUsers中的位置

命令行:dotnet ef migrations add <nameofmigration>

PMC:Add-Migration <nameofmigration>

然后运行Update-Database,这将提交您刚刚进行的所有更改。

https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/

我的一个项目的代码片段

 //remainder of Startup.cs left out for brevity    
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();

            app.UseBrowserLink();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();

        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseIdentityServer();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
              name: "areas",
              template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
            );


            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");


        });