3

我在这里束手无策。

在底部重现的步骤

MyProj.Mvc在 Visual Studio 2012 Update 3 中创建了一个 MVC 4 项目。

我按照这里的建议将我的放在项目下的GlobalResources.resx一个Resources文件夹中,以便它编译成 DLL。我在 中查看了生成的代码GlobalResources.resx.cs,一切都是公开的。我可以从其他.cs文件(例如HomeController.cs)访问资源就好了。

在任何视图中,我都无法将MyProj.Mvc命名空间置于当前上下文中。

例如,在任何 Razor 视图中,我都可以引用这样的资源:

@MyProj.Mvc.Resources.GlobalResources.AppName

但是,当我尝试执行以下操作时:

@Resources.GlobalResources.AppName

我得到一个错误。未Resources找到命名空间。

我按照这里的建议将命名空间放在我的 ~/Views/Web.config 中:

<add namespace="MyProj.Mvc" />

而且,视图仍然无法识别Resources命名空间。重建和/或重新启动 Visual Studio 不起作用。

“好吧,”我想,“去死吧,我只是@using在页面顶部放一个声明,稍后再处理。”

@using MyProj.Mvc // put at the top of the page

而且,视图仍然无法识别Resources命名空间。

所以请帮忙。帮助!我可能做错了什么,@using在页面顶部放置一个语句仍然不会将命名空间纳入范围?

重现步骤:

我已经能够用全新的、干净的项目重现这一点。Visual Studio 2012 Update 3,创建一个新的 ASP.NET MVC 4 Web 应用程序,名为MyProj.Mvc. 对于模板,我主要关注 Internet 应用程序,尽管我也在我的机器上使用 Empty 项目复制了它;选择 Internet 应用程序只是为了更好地匹配我所拥有的。在顶部_Layout.cshtml,放@using MyProj.Mvc. 在页面的其他地方,开始输入@Controllers.HomeController。请注意,自动完成功能甚至不会尝试提供Controllers命名空间,更不用说HomeController.

现在它变得很奇怪:

所以,那失败了。不过,这里有一些东西。尝试将using语句更改为@using MyProj.Mvc.Controllers. 现在,返回并开始输入@HomeController。有用!

那么,是什么让项目的命名空间如此特别,以至于它拒绝进入视图的范围???

4

1 回答 1

1

我认为您误解了如何访问名称空间。

仅仅因为您在代码中引用了命名空间,并不意味着您可以直接访问该命名空间的命名空间。

例如,试试这个:

创建一个新的 C# 类,MyDemoClass如下所示:

using System.Web;

public class MyDemoClass
{
    Mail.MailMessage // can't do this
}

请注意,我知道这System.Web.Mail是一个命名空间,并且我知道我可以访问它。但仅仅因为我是using System.Web并不意味着我可以跳入我的代码并输入Mail.<etc>. 编译器不知道我想要什么。幸运的是,它足够聪明地建议

Do you mean:
    System.Net.Mail
    System.Web.Mail

这就是为什么你可以using MyProj.Mvc.Controllers访问你的控制器类,但你不能简单地using MyProj.Mvc然后尝试Controllers从那里访问命名空间。它不起作用。

这也是为什么你会看到很多这样的:

using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;

而不是这个:

using System;
using Web;
using Mvc;
using Html;

我知道这感觉是多余的,但事情就是这样。

尝试确保引用了最后一个命名空间。如果Resources是命名空间,那么您需要using它或将其添加到Web.config.

于 2013-08-06T02:03:26.490 回答