You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:57:04