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

Mac版Visual Studio中C# MVC登录视图找不到异常求助

MVC迁移至Mac后登录失败时视图找不到的问题

项目从Windows版Visual Studio迁移到Visual Studio 2022 for Mac后,登录成功可正常跳转首页,但登录失败时抛出「视图未找到」异常——尽管~/Views/Account/login.cshtml确实存在,显式指定视图名称仍无效。


AccountController的Login接口代码

// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    AWS_Manager aws = new AWS_Manager(TestController.access_id, TestController.secret_key);
    var result = SignInStatus.Failure;

    UserModels oUser = await Task.Run(() => aws.getUser(model.Email));
    if (oUser != null)
    {
        if (oUser.Password == Crypto.GetSHA1(model.Password) && oUser.testloader_enabled == true)
        {
            SetUser(model.Email);
            result = SignInStatus.Success;
        }
    }

    // 不将登录错误计入账户锁定
    // 若要让密码错误触发账户锁定,请改为shouldLockout: true
    // var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:
            return RedirectToLocal(returnUrl);
        case SignInStatus.LockedOut:
            return View("Lockout");
        case SignInStatus.RequiresVerification:
            return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
        case SignInStatus.Failure:
        default:
            ModelState.AddModelError("", "登录尝试无效。");
            return View(model);
    }
}

异常信息

System.InvalidOperationException: 未找到视图“Login”或其母版,或者没有视图引擎支持搜索到的位置。已搜索以下位置:
~/Views/Account/Login.aspx
~/Views/Account/Login.ascx
~/Views/Shared/Login.aspx
~/Views/Shared/Login.ascx
~/Views/Account/Login.cshtml
~/Views/Account/Login.vbhtml
~/Views/Shared/Login.cshtml
~/Views/Shared/Login.vbhtml

RouteConfig代码

using System.Web.Mvc;
using System.Web.Routing;

namespace xxx
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

Startup.Auth.cs代码

namespace xxx
{
    public partial class Startup
    {
        // 有关配置身份验证的详细信息,请查看官方文档
        public void ConfigureAuth(IAppBuilder app)
        {
            // 配置数据库上下文、用户管理器和登录管理器,使其每个请求使用一个实例
            app.CreatePerOwinContext(ApplicationDbContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
            app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

            // 允许应用使用Cookie存储已登录用户的信息
            // 以及使用Cookie临时存储第三方登录用户的信息
            // 配置登录Cookie
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login"),
                Provider = new CookieAuthenticationProvider
                {
                    // 允许应用在用户登录时验证安全戳
                    // 这是更改密码或添加外部登录时的安全验证机制
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }
            });            
            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            // 允许应用在双因素验证过程中临时存储用户信息
            app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));

            // 允许应用记住双因素验证的设备信息
            // 开启后,同一设备登录时无需重复验证第二因素
            app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);
        }
    }
}

解决步骤

1. 修复文件大小写不匹配

Mac系统是大小写敏感的,而Windows默认不敏感。你的视图文件是login.cshtml(小写l),但代码中返回视图时默认匹配Login(大写L),直接导致Mac下找不到文件。

两种修复方式:

  • 代码中显式指定小写视图名:return View("login", model);
  • 将视图文件重命名为Login.cshtml,保持与Action名称大小写一致

2. 检查视图文件的输出配置

在Visual Studio for Mac中右键点击login.cshtml,选择属性,确认「复制到输出目录」设置为如果较新则复制或始终复制。若设置为「不复制」,运行时视图文件不会被打包到输出目录,自然找不到。

3. 确认Razor视图引擎注册

在Global.asax.cs的Application_Start方法中,确保已正确注册Razor视图引擎:

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());

缺少此配置可能导致Razor视图不被识别。

4. 清理重建项目

Mac版Visual Studio偶尔会出现缓存问题,执行以下操作:

  • 点击菜单「项目 > 清理」
  • 手动删除项目根目录下的bin和obj文件夹
  • 点击菜单「项目 > 重建」

5. 验证路由与命名空间一致性

确认AccountController的命名空间与路由配置中的命名空间一致,避免路由解析错误导致视图路径匹配失败。


内容的提问来源于stack exchange,提问作者Diego Perez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:45:30