共享项目和资源文件
Shared projects and resource files
我们有一个共享项目的解决方案被其他两个项目引用。
在共享项目中,我们有 resx
个文件,但我们注意到在添加或修改 resx 中的术语时,代码隐藏 Designer.cs
文件没有更新。显然,共享项目不支持嵌入式资源的自定义工具生成 (ResXFileCodeGenerator)。
我已经搜索了很长时间来克服这个限制。我尝试创建一个包含所有资源文件的 class 库,但后来我偶然发现了无法在共享项目中添加对该 class 库的引用的问题。
有人知道我该如何解决这个问题吗?在 class 库中拥有资源文件,并能够在我们的共享项目视图中使用它们?
--
除了上面的问题,当我们自己在 Designer.cs
文件中添加代码时,我们可以让 resx
文件在项目上工作,但看起来仍然有一些问题。
例如,在视图中,我们可以通过命名空间和术语名称获取翻译,但在 IDE 中它们显示为红色(不可解析)。但是,如果我们 运行 应用程序,它会正常工作。
更新:当 运行 应用程序时,我能够在我的视图中显示一个单独项目中的 resx
文件的翻译。但是,在视图所在的共享项目中,我对 resx
文件的引用仍显示为红色。这可能是因为共享项目没有对翻译项目的引用。构建后,具有引用的 'real' 项目可以找到 resx
翻译,因此在 运行 应用程序时没有问题。
有什么方法可以告诉 visual studio 我的共享项目使用来自单独的 class 库的 resx
文件,以便它找到术语并且不在我的引用下划线?让智能感知正常工作会很好。
根据评论中的要求,查看我的 View/Html 代码片段:
@using System.Configuration
@{
ViewBag.Title = "ManageCategories";
}
<div class="main container-fluid">
<div id="spis-categories" ng-controller="categoriesController as categoriesVm" ng-cloak ng-init="categoriesVm.siteName='@ConfigurationManager.AppSettings["siteName"]';categoriesVm.pageSize = @inConnexion.Common.Constants.Constants.PageSize">
<div class="modal cust-modal-ontop" tabindex="-1" role="dialog" id="confirmDeleteDialog" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog cust-modal-dialog">
<div class="modal-content cust-modal-content">
<div class="modal-header">
<h4 class="modal-title">@CategoryResources.SPIS_Categories_Maintenance.Button_Delete</h4>
</div>
<div class="modal-body">
<p>@CategoryResources.SPIS_Categories_Maintenance.Confirm_Delete</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" ng-click="categoriesVm.doDeleteSelected();"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span> @CategoryResources.SPIS_Categories_Maintenance.Label_Yes</button>
<button type="button" class="btn btn-default" ng-click="categoriesVm.cancelDeleteSelected();"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span> @CategoryResources.SPIS_Categories_Maintenance.Label_No</button>
</div>
</div>
</div>
</div>
然后查看此屏幕截图,其中无法识别引用:
另请注意,ViewBag 也未被识别。但是当 运行ning 时,一切都按预期工作...
可能只是设计视图中的命名空间问题。在 Views/web.config
文件中包含资源的命名空间。视图将使用其中包含的命名空间来解析类型。
Views/web.config
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization"/>
<add namespace="System.Web.Routing" />
<add namespace="System.Net.Http" />
<add namespace="{Resources name space here}" />
<!-- You could also include System.Configuration to avoid having to use using -->
<add namespace="System.Configuration" />
</namespaces>
</pages>
这对我使用 Visual Studio 2015 有效,请尝试以下操作:
不要将您的共享资源命名为 "Resources.resx" 或 "Resource.resx",因为这会导致冲突。使用 "Strings.resx" 或 "Translation.resx".
确保在设计器中打开resx文件时访问修饰符是public:
- 在您的项目中添加引用并在您的 Views/web.config 中引用命名空间,如@Nkosi 的回答中所述。
我能够创建一个共享资源 .resx 文件,该文件对每个其他项目和共享项目都是可见的。弄清楚这一点后,我遇到了这个提供详细信息的问题:Share Resource Files Across Projects。正如 Charlie 在第二个答案中指出的那样,重要的一点是,在获取共享资源的每个项目的 .csproj 文件中,必须调整 linked .resx 文件的 LogicalName,以便设计器文件可以在程序集中找到资源。我创建了一组测试文件来说明这一点——这里要列出的代码太多了,但如果有人感兴趣,可以在 github 上找到。我不知道 post 一个 link 到存储库是否可以,所以我将其省略。
我们有一个共享项目的解决方案被其他两个项目引用。
在共享项目中,我们有 resx
个文件,但我们注意到在添加或修改 resx 中的术语时,代码隐藏 Designer.cs
文件没有更新。显然,共享项目不支持嵌入式资源的自定义工具生成 (ResXFileCodeGenerator)。
我已经搜索了很长时间来克服这个限制。我尝试创建一个包含所有资源文件的 class 库,但后来我偶然发现了无法在共享项目中添加对该 class 库的引用的问题。
有人知道我该如何解决这个问题吗?在 class 库中拥有资源文件,并能够在我们的共享项目视图中使用它们?
--
除了上面的问题,当我们自己在 Designer.cs
文件中添加代码时,我们可以让 resx
文件在项目上工作,但看起来仍然有一些问题。
例如,在视图中,我们可以通过命名空间和术语名称获取翻译,但在 IDE 中它们显示为红色(不可解析)。但是,如果我们 运行 应用程序,它会正常工作。
更新:当 运行 应用程序时,我能够在我的视图中显示一个单独项目中的 resx
文件的翻译。但是,在视图所在的共享项目中,我对 resx
文件的引用仍显示为红色。这可能是因为共享项目没有对翻译项目的引用。构建后,具有引用的 'real' 项目可以找到 resx
翻译,因此在 运行 应用程序时没有问题。
有什么方法可以告诉 visual studio 我的共享项目使用来自单独的 class 库的 resx
文件,以便它找到术语并且不在我的引用下划线?让智能感知正常工作会很好。
根据评论中的要求,查看我的 View/Html 代码片段:
@using System.Configuration
@{
ViewBag.Title = "ManageCategories";
}
<div class="main container-fluid">
<div id="spis-categories" ng-controller="categoriesController as categoriesVm" ng-cloak ng-init="categoriesVm.siteName='@ConfigurationManager.AppSettings["siteName"]';categoriesVm.pageSize = @inConnexion.Common.Constants.Constants.PageSize">
<div class="modal cust-modal-ontop" tabindex="-1" role="dialog" id="confirmDeleteDialog" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog cust-modal-dialog">
<div class="modal-content cust-modal-content">
<div class="modal-header">
<h4 class="modal-title">@CategoryResources.SPIS_Categories_Maintenance.Button_Delete</h4>
</div>
<div class="modal-body">
<p>@CategoryResources.SPIS_Categories_Maintenance.Confirm_Delete</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" ng-click="categoriesVm.doDeleteSelected();"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span> @CategoryResources.SPIS_Categories_Maintenance.Label_Yes</button>
<button type="button" class="btn btn-default" ng-click="categoriesVm.cancelDeleteSelected();"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span> @CategoryResources.SPIS_Categories_Maintenance.Label_No</button>
</div>
</div>
</div>
</div>
然后查看此屏幕截图,其中无法识别引用:
另请注意,ViewBag 也未被识别。但是当 运行ning 时,一切都按预期工作...
可能只是设计视图中的命名空间问题。在 Views/web.config
文件中包含资源的命名空间。视图将使用其中包含的命名空间来解析类型。
Views/web.config
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization"/>
<add namespace="System.Web.Routing" />
<add namespace="System.Net.Http" />
<add namespace="{Resources name space here}" />
<!-- You could also include System.Configuration to avoid having to use using -->
<add namespace="System.Configuration" />
</namespaces>
</pages>
这对我使用 Visual Studio 2015 有效,请尝试以下操作:
不要将您的共享资源命名为 "Resources.resx" 或 "Resource.resx",因为这会导致冲突。使用 "Strings.resx" 或 "Translation.resx".
确保在设计器中打开resx文件时访问修饰符是public:
- 在您的项目中添加引用并在您的 Views/web.config 中引用命名空间,如@Nkosi 的回答中所述。
我能够创建一个共享资源 .resx 文件,该文件对每个其他项目和共享项目都是可见的。弄清楚这一点后,我遇到了这个提供详细信息的问题:Share Resource Files Across Projects。正如 Charlie 在第二个答案中指出的那样,重要的一点是,在获取共享资源的每个项目的 .csproj 文件中,必须调整 linked .resx 文件的 LogicalName,以便设计器文件可以在程序集中找到资源。我创建了一组测试文件来说明这一点——这里要列出的代码太多了,但如果有人感兴趣,可以在 github 上找到。我不知道 post 一个 link 到存储库是否可以,所以我将其省略。