2

我有一个 ascx 在这样的转发器中使用 Eval:

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="Similar.ascx.vb" Inherits="x.y.z.Similar" %>
<asp:repeater runat="server" id="rptAlternatives" visible="false" Enableviewstate="false">
    <HeaderTemplate>
        <section id="similar" class="sidelist sideModule">
            <h3>Possible Alternatives:</h3> 
            <ul class="sideborder">
    </HeaderTemplate>
    <ItemTemplate>
        <li>
            <a href="/bar/<%# Eval("URL")%>" class="box">foo</a>
        </li>
    </ItemTemplate>
    <FooterTemplate>
            </ul>
        </section>
    </FooterTemplate>
</asp:repeater>

这在我的开发 PC 上运行良好,但是当我将它部署到我们的实时服务器时它失败了:Compiler Error Message: BC30451: 'Eval' is not declared. It may be inaccessible due to its protection level.真正奇怪的是,有时重新启动应用程序池会使其消失,然后有时又会再次出现。此外,它不会在使用Eval.

本地环境是 IIS 7.5.7600.16385,应用程序池运行 ASP.NET v4.0 Classic。服务器环境是一样的。我在我的机器上从 VS 发布并将其复制到实时服务器上进行部署。

在此部署之前,现场站点使用的是 v2.0。将站点升级到 v4.0 是我们尝试发布的更改的一部分。作为此版本的一部分,此代码没有更改。它一直使用 Eval,这一直很好。

我已经安装了 Visual Studio 11 beta,但我在这个项目中使用的是 2010。

有什么想法可能导致这种情况吗?

编辑:

这个专家交流帖子似乎描述了完全相同的行为。他们通过在 ascx 和 ascx.vb 文件中更改其类的名称来“修复”它。它们在更改之前匹配,并且在更改之后匹配,但是更改显然在编译器中慢跑了一些东西。我可能会试一试,但特定的 ascx 会停止工作似乎并不令人满意。

我还发现很多帖子建议将其更改为DataBinder.Eval(Container.DataItem, "URL"). 但是,当代码之前工作并且突然停止时,我再次不愿意这样做。这是我不愿意使用的神奇而随机的“修复”。

4

2 回答 2

0

事实证明,重要的细节是我们正在从 v2.0 更新到 v4.0,并且我们正在将文件复制到先前部署的顶部。

先前部署的服务器上的 bin 目录中仍有 v2.0 预编译的网站 DLL。由于预编译的 DLL 名称在版本之间发生变化,旧的并没有被替换。不知何故,在同一目录中有 v2.0 和 v4.0 DLL 会使服务器感到困惑。因为我的开发机器上没有这些旧的 DLL,所以我没有看到同样的问题。

删除旧的 DLL 已解决此问题。

于 2012-07-03T09:35:08.807 回答
0

这发生在 VS2017 中,在我的情况下,当从其他或更旧的项目(添加->现有项目)添加类时,或者当您添加控件/WebForm,而不是从其他或更旧的项目中剪切和粘贴代码时。

解决方法如下:

  1. 不要使用 Add->Existing Item
  2. 添加新的 EMPTY 控件/WebForm(保留默认名称)
  3. 打开后面的代码并在空的默认文件上运行编译
  4. 在 .aspx 中添加一些代码,例如 DIV 标记
  5. 再次编译
  6. 从文件后面的代码中引用 DIV 标记(即 DivId.Visible = False)
  7. 再次编译
  8. 现在程序集/编译器已连接到新文件/类
  9. 现在将其他项目中的代码剪切并粘贴到编辑器中
    1. 再次编译
    2. 没有更多的错误!

享受!

于 2018-11-24T21:01:34.287 回答