共享项目和资源文件

时间:2017-09-05 14:58:07

标签: c# asp.net-mvc visual-studio shared-project

我们有一个共享项目的解决方案,该项目由另外两个项目引用。

在共享项目中,我们有resx个文件,但我们注意到在resx中添加或修改术语时,代码隐藏Designer.cs文件未更新。显然,共享项目不支持嵌入式资源的自定义工具生成(ResXFileCodeGenerator)。

我一直在寻找克服这个限制的时间。我尝试使用所有资源文件创建一个类库,但后来我偶然发现了无法在共享项目中添加对该类库的引用的问题。

有谁知道如何解决这个问题?将资源文件放在类库中,并且能够在我们的共享项目视图中使用它们吗?

-

除了上面的问题之外,当我们在resx文件中添加代码时,我们可以获取Designer.cs文件处理项目,但看起来仍然存在一些问题。

例如,在视图中,我们可以通过命名空间和术语名称获得翻译,但在IDE中,它们显示为红色(不可解析)。但是,如果我们运行应用程序,它就会像它应该的那样工作。

更新:在运行应用程序时,我能够在我的视图中显示的单独项目中从resx文件进行翻译。但是,在视图所在的共享项目中,我对resx文件的引用仍显示为红色。这可能是因为共享项目没有引用翻译项目。一旦构建,具有引用的“真实”项目可以找到resx转换,因此在运行应用程序时没有问题。

有没有办法告诉visual studio我的共享项目使用来自单独类库的resx文件,以便它找到条款并且不强调我的引用?让intellisense工作会很好。

根据评论中的要求,请参阅我的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>&nbsp;@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>&nbsp;@CategoryResources.SPIS_Categories_Maintenance.Label_No</button>
            </div>
        </div>
    </div>
</div>

然后看这个屏幕截图,其中无法识别引用:

No references found

另请注意,ViewBag也无法识别。但是在跑步时,一切都按预期工作......

3 个答案:

答案 0 :(得分:2)

可能只是设计视图中的命名空间问题。在Views/web.config文件中包含资源的命名空间。视图将使用其中包含的命名空间来解析类型。

查看/ 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>

答案 1 :(得分:2)

这对我使用Visual Studio 2015很有用,请尝试以下方法:

  1. 不要为共享资源命名&#34; Resources.resx&#34;或者&#34; Resource.resx&#34;因为这会导致冲突。使用&#34; Strings.resx&#34;或&#34; Translation.resx&#34;。

  2. 在设计器中打开resx文件时,请确保访问修饰符是公共的:

  3. Resources Access Modifier

    1. 在项目中添加引用,并在Views / web.config中引用命名空间,如@Nkosi的回答中所述。

答案 2 :(得分:0)

我能够创建一个共享资源.resx文件,该文件对其他每个项目以及一个共享项目都是可见的。在弄清楚这一点之后,我遇到了一个提供详细信息的问题:Share Resource Files Across Projects。正如查理(Charlie)在第二个答案中指出的那样,重要的一点是,在获取共享资源的每个项目的.csproj文件中,必须对链接的.resx文件的LogicalName进行调整,以便设计器文件可以在.csx文件中找到该资源。部件。我创建了一个测试文件集来说明这一点-这里有太多代码要列出,但是如果有人感兴趣的话,可以在github上找到。我不知道是否可以将链接发布到存储库,所以我将其省略。