【问题标题】:Neither Views/Web.config or @using add MVC project's namespace to the viewViews/Web.config 或 @using 都不会将 MVC 项目的命名空间添加到视图中
【发布时间】:2013-08-06 01:33:24
【问题描述】:

我在这里束手无策。

在底部重现的步骤

我在 Visual Studio 2012 Update 3 中创建了一个 MVC 4 项目,例如 MyProj.Mvc

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

我无法让MyProj.Mvc 命名空间在任何视图的当前上下文中。

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

@MyProj.Mvc.Resources.GlobalResources.AppName

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

@Resources.GlobalResources.AppName

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

我按照here 的建议将命名空间放在我的 ~/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,创建一个名为 MyProj.Mvc 的新 ASP.NET MVC 4 Web 应用程序。对于模板,我主要关注 Internet 应用程序,尽管我也在我的机器上使用 Empty 项目复制了它;选择 Internet 应用程序只是为了更好地匹配我所拥有的。在_Layout.cshtml 的顶部,放置@using MyProj.Mvc。在页面的其他地方,开始输入@Controllers.HomeController。请注意,自动完成功能甚至不会尝试提供 Controllers 命名空间,更不用说 HomeController

现在变得奇怪了:

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

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

【问题讨论】:

  • 您是否尝试将资源移动到 App_GlobalResources 文件夹?然后使用@TestApp.App_GlobalResources.Resource1 访问它
  • 我给出的第一个链接建议不要使用 App_GlobalResources 文件夹,因为它会导致单元测试出现问题。

标签: c# asp.net-mvc-4 razor visual-studio-2012


【解决方案1】:

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

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

例如,试试这个:

像这样创建一个名为 MyDemoClass 的新 C# 类:

using System.Web;

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

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

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 中。

【讨论】:

  • 那为什么我可以从 HomeController 访问 Resources.GlobalResources.AppName 呢?无论如何,至少你让我意识到我应该按照你说的去做,并在我的 ~/Views/Web.config 中引用 MyProj.Mvc.Resources 并以这种方式引用我的字符串。我可以发誓我曾在某处看到它被引用为 Resources.GlobalStrings.AppName (或等效项),但不值得在这上面浪费我的时间,尤其是当我试图保存击键时。
  • 你为你的GlobalResources.resx 使用了什么命名空间?如果您使用 Resources.GlobalResources,您可以在 Razor 中使用 @Resources.GlobalResources 自动访问它,但如果您将命名空间设置为 MyProj.Mvc.Resources.GlobalResources,则不能。
  • 后者,MyProj.Mvc.Resources.GlobalResources。正如您所建议的,也许我看到的示例在 Resources 命名空间下具有资源类。很奇怪,我可以在 HomeController 中将其称为 Resources.GlobalResources.&lt;resource-name&gt; 就好了。也许它与它是当前作用域的同级命名空间有关(HomeControllerMyProj.Mvc.Controllers 下,同级到 Myproj.Mvc.Resources)?我想这是有道理的,因为 Razor 视图可能不在命名空间内,所以不会有任何同级命名空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多