【问题标题】:Controller Action not triggered - Simple Project - ASP.NET MVC CORE 2.0控制器动作未触发 - 简单项目 - ASP.NET MVC CORE 2.0
【发布时间】:2019-04-15 08:06:01
【问题描述】:

我有一个非常简单的网络应用程序,我尝试让人们注册用户。因此,我尝试将用户注册数据保存到 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 中设置的断点不会被触发,数据库表 register 也不会更新。

提前谢谢你。

【问题讨论】:

  • 您可以使用 Chrome 开发者工具或 Fiddler 来确认要发布的内容正在发送到您的控制器吗?
  • @KevinRaffay 当我点击按钮提交时,它会回复状态码 200,并且请求方法是 POST。它似乎没有触发我在 Controller 类中的方法。
  • @KevinRaffay 我相信我找到了问题所在。我在视图中的表单有两个输入字段,电子邮件和密码,我尝试提交它们。但是,我的 ActionResult 与接收这些参数不匹配,因此它从未被触发。感谢您的帮助!
  • 很好,不知道为什么它没有将字段绑定到注册模型。
  • @KevinRaffay 如果您好奇,请继续跟进;似乎我的字段没有绑定到模型的原因是因为我没有在我的视图中添加标签助手。在我看来,这条线似乎已经完成了这项工作:@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

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


【解决方案1】:

所以您确实意识到 Identity 会为您创建表?它们通常被命名为 AspNetUsers、AspNetRoles、AspNetRoleUsers 等...因此创建 register 将是 Identity 永远不会使用的表。

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

事实上,您无法通过断点访问该方法...对于 UseFileServer 干扰 MVC 的方法...始终将 UseMVC() 作为最后一个条目。顺序很重要。

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

命令行:dotnet ef migrations add &lt;nameofmigration&gt;

PMC:Add-Migration &lt;nameofmigration&gt;

然后运行 ​​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?}");

            
        });

【讨论】:

  • 您好,您的评论极大地帮助了我解决了我遇到的问题。我不知道Identity 不能与自定义表一起使用,而只能使用它自己的表。由于缺少默认标识表,这导致我在 DataContext.cs 类中发现错误:该类继承自 DbContext,但它应该是 IdentityDbContext。最后,由于某种原因,在控制器方法RegisterUser 中,user 必须使用除了Email 之外的用户名进行实例化(不知道为什么?) - 所以感谢您帮助我朝着正确的方向前进!如果以后有人遇到这个问题,请不要犹豫给我写信
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多