Ho un'applicazione web molto semplice, in cui cerco di permettere alle persone di registrare un utente. Pertanto, provo a salvare i dati di registrazione degli utenti su Entity Framework, ma senza fortuna.
Per qualche ragione, IActionResult RegisterUser
non viene attivato quando si invia un modulo (ho provato a impostare i breakpoint, non è successo nulla). Qualcuno può scoprire perché?
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>
controllore
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();
}
}
Quando invio il modulo, i punti di interruzione impostati in Controller-action RegisterUser
non vengono attivati e il register
tabella di database non viene aggiornato.
Grazie in anticipo.
quindi ti rendi conto che Identity crea tabelle per te? Solitamente sono denominati AspNetUsers, AspNetRoles, AspNetRoleUsers, ecc. Quindi la creazione del register
sarà una tabella che Identity non utilizzerà mai.
Se le tabelle elencate in precedenza non sono nel database creato, è necessario creare una migrazione, in genere la migrazione initial
che crea tutte le tabelle di identità. utilizzando i comandi PMC o la riga di comando con dotnet
. Ti suggerisco di ricreare il progetto con account di utenti individuali selezionati per le funzionalità di identità dello scaffold.
Il fatto che tu non sia stato in grado di raggiungere quel metodo con un punto di interruzione ... Per uno che UseFileServer interferisce con MVC ... UseMVC()
sempre sempre UseMVC()
come ultima voce. L'ordine conta.
Non appena questo metodo viene colpito, si verificherà un errore poiché UserManager morirà a causa delle tabelle non esistenti poiché quella sarà la posizione del nuovo utente creato in AspNetUsers
commandline: le dotnet ef migrations add <nameofmigration>
PMC: Add-Migration <nameofmigration>
quindi eseguire Update-Database
questo impegna tutte le modifiche appena fatte.
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?}");
});