【问题标题】:Using System.Data.Linq in a Razor view在 Razor 视图中使用 System.Data.Linq
【发布时间】:2023-04-03 08:36:01
【问题描述】:

我可能对这里发生的事情有一个根本的误解,但是我在我的剃刀视图中循环通过 LinqToSQL 类时遇到了问题:

<h3>Owners</h3>
@foreach (var ThisOwner in Prop.PropertyOwnerships.Where(p=p.bIsOwner.Value==true))
{
<div class="ODEditEntry">
...

我收到以下错误:

编译器错误消息:CS0012:类型“System.Data.Linq.EntitySet`1”在未引用的程序集中定义。您必须添加对程序集 'System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 的引用。

我尝试将 @using System.Data.Linq 放在 cshtml 文件的顶部,但它告诉我 Linq 在 System.Data 命名空间中不存在。这显然不是真的,是的,我的项目中确实有 system.data.linq 作为参考。

这里有什么想法吗?需要进口吗?我可以不在我的剃刀视图中做 Linq 风格的东西吗?那看起来……很奇怪?

【问题讨论】:

  • 你可以在你的普通课程中使用 Linq 吗? (只是要确定)。 @Using 语句应该足够了。
  • 你是在本地运行还是部署到另一台服务器上?
  • 在将 System.Data.Linq 引用的“复制本地”属性设置为 true 时,您是否也遇到了该错误?
  • 工作:在我的控制器中就好了。事实上,我目前的工作是这样的:ViewBag.OwnerList = Prop.PropertyOwnerships.Where(p => p.bIsOwner.Value == true).ToList();
  • 这看起来……很奇怪。 System.Data.Linq 不应该在 GAC 中并具有通用访问权限。

标签: linq-to-sql asp.net-mvc-3 razor


【解决方案1】:

您需要通过在视图顶部添加@using System.Data.Linq 将命名空间导入视图。但是,如果您希望在所有视图中使用它,则需要将 &lt;add namespace="System.Data.Linq" /&gt; 添加到您的 Views 文件夹中的 web.config 中:

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <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.Routing" />
        <add namespace="System.Data.Linq" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

虽然与您的问题无关,但您确实应该尝试将此逻辑移出视图并移入控制器,这将使调试变得更加容易,并且意味着您的演示文稿与您的业务逻辑分开。

【讨论】:

  • 你是在最后一句中说应该将 Linq 拉回控制器,而不是让控制器发送已经过滤的集合吗?只是试图掌握在我自己的代码中处理此类事情的最佳方法。
  • 是的,视图应该只关心数据的呈现,而将逻辑、排序、排序等留给控制器。
  • 如果上述方法不起作用(添加到您的视图文件夹中的 web.config),您还应该尝试将以下内容添加到主 web.config 文件中:&lt;add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /&gt; in system.web \编译\程序集
  • 要详细说明 jao 的答案,您可以将其输入到 web.config 中:
  • @AdamFlanagan 我明白你关于将选择拉入控制器的观点,但排序/排序不是比逻辑更重要的表示点吗? (只是想了解不同的观点......)
【解决方案2】:

为我解决的问题是右键单击 System.Data.Linq 程序集引用,然后点击属性。在那里将 Copy Local 设置为 true。

【讨论】:

  • 是的!这是工作。也许 view.cshtml 被编译为 dll,但 dll 没有引用 system.data.linq。为什么将system.data.linq复制到本地就可以了?
【解决方案3】:

您的 Linq-to-Sql 数据上下文是否存在于 Web 项目之外(例如,在另一个类库中)?如果是这样,那么在您添加了对该项目的引用的地方,它一切都构建得很好,但是在 Razor 视图中,您试图直接从 System.Data.Linq 程序集中访问一个类型,而不在 Web 项目中引用它。尝试添加对主 Web 项目的引用,看看会得到什么。

【讨论】:

  • 都在同一个项目中
【解决方案4】:

您需要在您的项目和/或您的Web.config 中添加对System.Data.Linq 的引用。

【讨论】:

  • 我在参考文献中有它。我会尝试将它添加到 web.config 的程序集部分。
【解决方案5】:

我花了好几个小时在谷歌上搜索,但没有任何解决方案有效,但这有助于...

删除 web.config 中 &lt;assemblies&gt; 元素内的所有内容!

<compilation targetFramework="4.7.2">
  <assemblies>
    <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <!-- etc etc blah blah -->
  </assemblies>
</compilation>

要么在其中添加System.Core,或者更好的是,删除所有内容并将其更改为:

<compilation targetFramework="4.7.2"/>

说明

System.Linq 命名空间是在 System.Core 中定义的,对吧?因此,我们要么需要将其添加到 &lt;assemblies&gt; 列表中,要么(因为 System.Core 始终在位于“%Windir%/Microsoft.NET/v4.0.30319”的根 web.config 中引用/Framework/whatever") 删除 &lt;assemblies&gt; 中的所有内容以防止冲突。

【讨论】:

    猜你喜欢
    • 2019-05-14
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2016-02-22
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多