我有一个非常简单的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
。
谢谢。
答案 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?}");
});