ASP.NET MVC 3 无法识别 .cshtml 视图文件

Posted

技术标签:

【中文标题】ASP.NET MVC 3 无法识别 .cshtml 视图文件【英文标题】:ASP.NET MVC 3 won't recognise .cshtml view files 【发布时间】:2012-09-10 12:44:49 【问题描述】:

我已将一个 mvc 3 应用从 vs 2010 移植到 vs2012。

移植的应用程序使用 .NET 4。

所有旧位都可以工作,但是对于在 vs 2012 中创建的新视图,视图引擎不会为视图寻找 .cshtml 文件。

例如,当用户在Solicitors区域的Welcome控制器上请求索引动作时,url为:

mysite.com/solicitors/welcome/gg 

(其中 gg 是用户名)。在这种情况下,返回的错误是:

未找到视图“索引”或其主视图或没有视图引擎 支持搜索的位置。以下位置是 搜索:~/Areas/Solicitors/Views/Welcome/Index.aspx ~/Areas/Solicitors/Views/Welcome/Index.ascx ~/Areas/Solicitors/Views/Shared/Index.aspx ~/Areas/Solicitors/Views/Shared/Index.ascx ~/Views/Welcome/Index.aspx ~/Views/Welcome/Index.ascx ~/Views/Shared/Index.aspx ~/Views/Shared/Index.ascx ~/Areas/Solicitors/Views/Welcome/gg.master ~/Areas/Solicitors/Views/Shared/gg.master ~/Views/Welcome/gg.master ~/Views/Shared/gg.master ~/Areas/Solicitors/Views/Welcome/gg.cshtml ~/Areas/Solicitors/Views/Welcome/gg.vbhtml ~/Areas/Solicitors/Views/Shared/gg.cshtml ~/Areas/Solicitors/Views/Shared/gg.vbhtml ~/Views/Welcome/gg.cshtml ~/Views/Welcome/gg.vbhtml ~/Views/Shared/gg.cshtml ~/Views/Shared/gg.vbhtml

我已经在 web.config 中的 appsettings 中添加了以下键,但没有任何区别。

<add key="webpages:Version" value="1.0" />

编辑:

SolictorAreaRegistration.cs 中的路由:

context.MapRoute(
                "Solicitors_Welcome",
                "Solicitors/Welcome/nameUser",
                new  controller = "Welcome", action = "Index", nameUser = UrlParameter.Optional 
            );

编辑 2:

使用 RouteDebug,我可以看到找到了正确的控制器和操作。

路线数据

关键值

用户名:gg

控制器:欢迎

动作:索引

数据令牌

关键值

命名空间:System.String[]

领域:律师

UseNamespaceFallback: False

编辑 3:

路由找到正确,从调试中我可以看出:索引操作被命中。

在调用视图的行调用时会出现问题:

namespace MyApp.Areas.Solicitors.Controllers

    [Authorize]
    public partial class WelcomeController : Controller
    
        //
        // GET: /Solicitors/Welcome/
        public virtual ActionResult Index(string nameUser)
        
            return View("Index", nameUser);
         
    

【问题讨论】:

【参考方案1】:

好的,明白了:

问题:

问题是我的视图模型是字符串类型的。在我的操作中,我传入了一个字符串作为模型参数:

public virtual ActionResult Index(string nameUser)
        
            return View("Index", nameUser);
        

这将与 Controller.View(...) 的重载之一发生冲突:

View(string, string)

第二个参数需要布局文件的名称。当你这样做时,MVC 会去寻找一个布局文件,其名称与你的字符串的值相同,例如:

“你好,世界。我是个白痴,但如果你给我一个像样的错误信息,我也许可以修复这个错误。”

显然,不存在具有该名称的布局文件。也没有名为“gg”的布局文件(我的(测试)律师的用户名)。

解决方案:

解决方法很简单:

指定第二个参数是模型,而不是布局。

public virtual ActionResult Index(string nameUser)
        
            return View("Index", model: nameUser);
        

有用的文章:

要查看对此问题的详细讨论,请参阅以下文章:

MVC Gotcha: Beware when using your view's model is a string

非常感谢 heartysoft.com 的启发。

【讨论】:

【参考方案2】:

它看起来就像您从错误消息中看到的那样:

~/Areas/Solicitors/Views/Welcome/gg.cshtml 

如果您需要查找索引视图,那么您需要指定它:

http://mysite.com/solicitors/welcome/index/gg 

【讨论】:

这行得通,但是使用我正在使用的路线(请参阅问题的编辑),我不需要在 url 中指定操作。 确实应该可以。它对我有用。我无法重现您描述的问题。 谢谢你帮助达林。解决方案在我对我的问题的回答中。不知道为什么会这样,但解决方案有效。

以上是关于ASP.NET MVC 3 无法识别 .cshtml 视图文件的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 5 默认模板的JS和CSS 是怎么加载的?

ASP.NET MVC 动态模型未被识别

将 [Authorize] 添加到控制器无法重定向到身份登录路由。 ASP.NET 核心 3.1 MVC

混合 SPA 和 ASP.NET MVC 路由

识别 ASP.NET MVC 代码中的 Angular js AJAX 调用

无法更改 ASP.NET MVC 3 中文本框的值