0

我正在使用带有常规 asp.net 开发服务器的 vs2010 win7 x64 MVC 3。以及最新版本的firefox、IE9和chrome。

我有一个强类型视图,我正在尝试通过 Arjan Einbu 为 mvc 3 提供的此代码asp-net-mvc-ajax-actionlink-with-image的略微修改版本来获得一个 ajax 扩展方法。

这是我的扩展方法代码,位于我的 mvc 网站的 App_Code 文件夹中的 Helper.cs 文件中。

public static class HelperExtensions
{
    public static IHtmlString ImageActionLink(this AjaxHelper helper, string imageUrl, string titleText, string actionName, object routeValues, AjaxOptions ajaxOptions)
    {
        var builder = new TagBuilder("img");
        builder.MergeAttribute("src", imageUrl);
        builder.MergeAttribute("title", titleText);
        var link = helper.ActionLink("[replaceme]", actionName, routeValues, ajaxOptions).ToHtmlString();
        return new MvcHtmlString(link.Replace("[replaceme]", builder.ToString(TagRenderMode.SelfClosing)));
    }
}

在我看来,我@model IEnumerable<Models.SpeciesType>在顶部定义了模型并且我正在使用......

        @Ajax.ImageActionLink(Url.Content("~/Content/ThumbUp.png"), "Valid/Appropriate", "VoteUp", new {id = item.ID}, new AjaxOptions { HttpMethod = "POST" } ); 

插入带有图像的 ajax 操作链接,以允许用户对项目进行投票。上面的代码不起作用,无论我做什么,它都会在无尽的错误之后不断给我错误。它给我的当前错误是......

编译器错误消息:CS0121:以下方法或属性之间的调用不明确:'HelperExtensions.ImageActionLink(System.Web.Mvc.AjaxHelper, string, string, string, object, System.Web.Mvc.Ajax.AjaxOptions)' 和'HelperExtensions.ImageActionLink(System.Web.Mvc.AjaxHelper,字符串,字符串,字符串,对象,System.Web.Mvc.Ajax.AjaxOptions)'

这意味着我在同一个命名空间中有两个具有相同名称和签名的方法发生冲突,这也是不可能的,因为我只在一个代码文件中定义了一次。所以我认为可能存在缓存问题,所以我在 Firefox 中执行了 ctrl+shift+delete 并完全清除了缓存、历史记录和其他所有内容。刷新页面,我得到同样的错误。我还在 IE9 和 chrome 中测试过同样的问题。

我停止并启动了 asp.net 开发服务器,退出了 Visual Studio 并重新启动了同样的问题。

磁盘清理是否检查了所有内容并运行它。磁盘清理没有删除“C:\Users\Dean\AppData\Local\Temp”中的所有文件,所以我手动删除了文件夹中的所有剩余文件,包括“Temporary ASP.NET Files”文件夹。然后我再次运行vs2010并运行网站。再次出现相同的错误“CS0121:以下方法之间的调用不明确......等等”

无论我做什么,我都无法摆脱这个错误。这不是我得到的唯一错误。在此错误开始持续存在之前,我还遇到了与 mvc 无法找到具有正确签名的 ImageActionLink 方法相关的错误,即

ImageActionLink(this AjaxHelper<IEnumerable<SpeciesType>> helper, etc etc

我认为该错误与我使用强类型视图有关。

因此,为了尝试摆脱“调用不明确”的错误,我注释掉了整个 ImageActionLink 方法并重新编译并再次运行该网站。我收到了这个错误

编译器错误消息:CS1061:“System.Web.Mvc.AjaxHelper>”不包含“ImageActionLink”的定义,并且没有接受“System.Web.Mvc.AjaxHelper>”类型的第一个参数的扩展方法“ImageActionLink”可能是找到(您是否缺少 using 指令或程序集引用?)

该错误完全有道理,因为 ImageActionLink 不再存在。所以接下来我做的是取消注释 ImageActionLink 方法重新编译并再次运行网站。果然,同样的“呼叫不明确”错误。

我不知所措。我已经尽我所能清除各种缓存以排除这种情况,注释和取消注释代码片段并测试哪些部分中断。但我被困在无法通过“呼叫不明确”的错误。

任何人都知道如何解决这个“调用不明确”的错误,所以我可以继续问为什么我似乎无法让一个简单的 ajax 扩展方法工作?


我摆脱了“电话不明确”的错误。发生的事情是我复制了 Arjan Einbu 的 mvc 3 版本的代码,在这里找到了asp-net-mvc-ajax-actionlink-with-image

然后我在 Visual Studio 的 App_Code 文件夹中创建了一个新类,并执行了 ctrl+a ctrl+v 并仅用 HelperExtensions 类替换了所有预生成的类模板代码。问题是我没有使用与网站名称空间匹配的名称空间来包装 HelperExtensions。

关于 asp.net 如何在没有名称空间的情况下编译代码文件的一些事情搞砸了。我假设这可能是因为代码是在构建时在主网站 dll 中编译的,然后当 asp.net 运行时,它会编译它在 app_code 文件夹中找到的任何代码文件,因此两个类具有相同的名称和相同的方法名称或一些这样的。

无论如何,既然我已经解决了这种恶化,我运行我的网站,我得到了休闲错误......

Compiler Error Message: CS1061: 'System.Web.Mvc.AjaxHelper<IEnumerable<Models.SpeciesType>>' does not contain a definition for 'ImageActionLink' and no extension method 'ImageActionLink' accepting a first argument of type 'System.Web.Mvc.AjaxHelper<IEnumerable<Models.SpeciesType>>' could be found (are you missing a using directive or an assembly reference?)

该错误看起来好像正在查找 ImageActionLink 方法,但 ImageActionLink 方法的第一个参数不是该类型AjaxHelper<IEnumerable<Models.SpeciesType>>

这个错误不太合理。是的,ImageActionLink 方法的第一个参数是 AjaxHelper 类型,但不是通用 AjaxHelper 类型。所以我尝试像这样修改 ImageActionLink 方法声明

  public static IHtmlString ImageActionLink(this AjaxHelper<IEnumerable<SpeciesType>> helper, string imageUrl, string titleText, string actionName, object routeValues, AjaxOptions ajaxOptions)

但我仍然得到同样的错误。ImageActionLink 上的第一个参数是 AjaxHelper 类型,但它被定义为“this AjaxHelper helper”,这意味着它是应该扩展 AjaxHelper 类的扩展方法。

我真的不需要@model IEnumerable<Models.SpeciesType>index.cshtml 文件顶部的

Compiler Error Message: CS1061: 'System.Web.Mvc.AjaxHelper<dynamic>' does not contain a definition for 'ImageActionLink' and no extension method 'ImageActionLink' accepting a first argument of type 'System.Web.Mvc.AjaxHelper<dynamic>' could be found (are you missing a using directive or an assembly reference?)

有谁知道我为什么会收到这个错误?以及如何解决?

4

1 回答 1

0

您在 Web.config 的哪个位置添加了命名空间(您正在使用剃刀视图)?到页面或到

<system.web.webPages.razor>
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="toolbox" />
        <add namespace="aa.App_Code"/>
      </namespaces>
    </pages>
</system.web.webPages.razor>

尝试在这里添加,修改视图(添加一些标签),并检查它是否有效。

于 2011-06-07T21:33:22.753 回答