.NET 6中ASP.NET C#视图无法关联AccountController问题求助
问题解决方案
你的登录按钮无法跳转至AccountController,核心问题出在路由配置缺失、控制器路由特性冲突、视图标签助手使用错误以及Razor页面与MVC混用这几个地方,具体修复步骤如下:
1. 修复Program.cs的路由配置
.NET 6中需要显式启用MVC服务和路由规则,原代码缺少相关配置,导致MVC控制器无法被正确识别。修改后的Program.cs如下:
public partial class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureServices((hostContext, services) => { var connectionString = hostContext.Configuration.GetConnectionString("Default"); services.AddDbContext<AppDbContext>(options => { options.UseMySql(connectionString, new MySqlServerVersion(new Version())); // 替换为你的MySQL版本 }); // 添加MVC服务支持视图和控制器 services.AddControllersWithViews(); }); webBuilder.Configure((context, app) => { // 启用路由 app.UseRouting(); // 启用授权(后续身份验证功能需要) app.UseAuthorization(); // 配置MVC默认路由 app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }); }); } // 可直接移除Startup类,所有配置已整合到Program.cs中
2. 修正AccountController的路由特性
你的AccountController添加了[Route("api/[controller]")],这是API控制器的路由规则,与MVC视图控制器的路由逻辑冲突,直接移除该特性即可:
using Bookshop.ContextDB; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace Bookshop.Controllers { // 移除[Route("api/[controller]")] public class AccountController : Controller { private readonly AppDbContext _dbContext; public AccountController(AppDbContext dbContext) { _dbContext = dbContext; } [HttpGet] public IActionResult Index() { return View(); } [HttpPost] public async Task<IActionResult> Login(string username, string password) { var user = await _dbContext.users.SingleOrDefaultAsync(u => u.username == username); if (user != null && VerifyPassword(password, user.password)) { // 登录成功跳转到Home/Index return RedirectToAction("Index", "Home"); } ModelState.AddModelError(string.Empty, "登录失败,用户名或密码错误。"); return View(); } private bool VerifyPassword(string inputPassword, string hashedPassword) { // 注意:明文对比存在安全风险,生产环境需改用PasswordHasher做哈希验证 return inputPassword == hashedPassword; } } }
3. 修正Index.cshtml的标签助手错误
- 移除
@page和@model IndexModel,这是Razor页面的标识,会导致MVC的asp-controller标签助手失效 asp-controller属性值只需写控制器名称前缀(Account),不需要加Controller后缀- 修正后的代码:
@{ ViewData["Title"] = "Home page"; } <head> <link rel="stylesheet" href="~/css/login-style.css" /> </head> @if (!User.Identity.IsAuthenticated) { <form method="post" asp-controller="Account" asp-action="Login" class="login-form-container"> <input type="text" name="username" placeholder="username" class="login-input" /><br /> <input type="password" name="password" placeholder="password" class="login-input" /><br /> <button type="submit" class="login-button">Login</button> </form> } else { <p>Hello, @User.Identity.Name! You are logged in.</p> <a asp-controller="Account" asp-action="Logout">Logout</a> }
额外注意事项
- 确保HomeController存在且包含Index视图,否则登录成功后的跳转会报错
- 密码验证部分目前为明文对比,生产环境必须使用
PasswordHasher进行哈希校验,避免安全漏洞
内容的提问来源于stack exchange,提问作者Orlando
相关产品推荐
相关产品推荐

