未触发控制器操作 - 简单项目 - ASP.NET MVC CORE 2.0
Controller Action not triggered - Simple Project - ASP.NET MVC CORE 2.0
我有一个非常简单的 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();
}
}
当我提交表单时,在 Controller-action RegisterUser
中设置的断点没有被触发,并且 Database-table register
没有更新。
提前谢谢你。
所以您确实意识到 Identity 会为您创建 tables?它们通常被命名为 AspNetUsers、AspNetRoles、AspNetRoleUsers 等...因此创建 register
将是一个 Identity 永远不会使用的 table。
如果前面列出的那些 table 不在您创建的数据库中,那么您需要创建一个迁移,通常是创建所有标识表的 initial
迁移。使用 PMC 命令或带 dotnet
的命令行。我建议您重新创建项目,并选择个人用户帐户来为您构建身份功能。
事实上,您无法使用断点来执行该方法...对于 UseFileServer 干扰 MVC 的情况...始终始终将 UseMVC()
作为最后一个条目。顺序很重要。
一旦该方法被命中,它就会出错,因为 UserManager 将因 table 不存在而死亡,因为那将是 AspNetUsers
[=20 中新创建用户的位置=]
命令行: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?}");
});
我有一个非常简单的 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();
}
}
当我提交表单时,在 Controller-action RegisterUser
中设置的断点没有被触发,并且 Database-table register
没有更新。
提前谢谢你。
所以您确实意识到 Identity 会为您创建 tables?它们通常被命名为 AspNetUsers、AspNetRoles、AspNetRoleUsers 等...因此创建 register
将是一个 Identity 永远不会使用的 table。
如果前面列出的那些 table 不在您创建的数据库中,那么您需要创建一个迁移,通常是创建所有标识表的 initial
迁移。使用 PMC 命令或带 dotnet
的命令行。我建议您重新创建项目,并选择个人用户帐户来为您构建身份功能。
事实上,您无法使用断点来执行该方法...对于 UseFileServer 干扰 MVC 的情况...始终始终将 UseMVC()
作为最后一个条目。顺序很重要。
一旦该方法被命中,它就会出错,因为 UserManager 将因 table 不存在而死亡,因为那将是 AspNetUsers
[=20 中新创建用户的位置=]
命令行: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?}");
});