System.Web.Mvc.HtmlHelper不包含EnumDropDownListFor的定义。

13
我一直在遵循这个教程 http://blogs.msdn.com/b/stuartleeks/archive/2010/05/21/asp-net-mvc-creating-a-dropdownlist-helper-for-enums.aspx,但我遇到了错误"System.Web.Mvc.HtmlHelper不包含EnumDropDownListFor的定义"。
模型:
public enum Codes
{
    IBC2012,
    IBC2009,
    IBC2006,
    FL2010,
    CBC2007
}

public class Code
{
    public int ID { get; set; }
    public int Active { get; set; }
    public string Description { get; set; }
    public string Edition { get; set; }
    public Codes Code { get; set; }
}

控制器:

public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        IEnumerable<TEnum> values = Enum.GetValues(typeof(TEnum)).Cast<TEnum>();

        IEnumerable<SelectListItem> items =
            values.Select(value => new SelectListItem
            {
                Text = value.ToString(),
                Value = value.ToString(),
                Selected = value.Equals(metadata.Model)
            });

        return htmlHelper.DropDownListFor(
            expression,
            items
            );
    }

HTML 助手:

@Html.EnumDropDownListFor(model => model.Code.Codes)

将您的EnumDropDownListFor的第一个参数更改为this HtmlHelper htmlHelper - Mathew Thompson
EnumDropDownListFor HTML助手是在控制器中吗?据我所知,扩展方法应该在某个静态类中。 - VJAI
8个回答

26

您忘记在视图中引用该扩展方法。这个EnumDropDownListFor方法是在某个命名空间内的某个静态类中定义的,对吗?

namespace AppName.SomeNamespace
{
    public static class HtmlExtensions
    {
        public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression)
        {
            ...
        }
    }
}

您需要将此命名空间添加到想要使用此助手的视图中:

@using AppName.SomeNamespace
@model MyViewModel
...
@Html.EnumDropDownListFor(model => model.Code.Codes)

为了避免在所有的 Razor 视图中添加这个 using 从句,你也可以将它添加到 ~/Views/web.config 文件的 <namespaces> 部分:

<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="AppName.SomeNamespace" />
      </namespaces>
    </pages>
</system.web.webPages.razor>

5

正如@ArhiChief在他们的回答中所暗示的,我的问题是:

using System.Web.WebPages.Html;

改为:

using System.Web.Mvc;

两个命名空间都有HtmlHelper的定义,如果添加错误的命名空间,将会出现此错误。将其替换为正确的命名空间即可解决。


4

将您的命名空间更改为

namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {
...

2
这对我有用...不知道为什么。 我看到System.Web.Mvc是web.config中注册的命名空间之一..但为什么我不能添加自己的命名空间? 我看过的所有教程,视频或任何东西都没有提到这一点。 我在所有地方都看到说要创建一个命名空间并将其添加到web.config中。 我多次尝试了这样做,甚至认为我可以使用我的扩展方法(例如@Html.MyMethod()),但智能感知无法识别它。 - Migs

2
在我的情况下,我已经引用了我的扩展命名空间,但是缺少了 System.Web.Mvc.Html 的 using 语句。 (DropDownList 方法定义在System.Web.Mvc.Html.SelectExtensions中)

2
也许问题在于你的 HtmlHelper 没有包含 DropDownList 的定义,因为 HtmlHelper 在多个命名空间中定义: System.Web.MvcSystem.Web.WebPages.HtmlSystem.Web.WebPages.Html 命名空间包含 HtmlHelper.DropDownList
此外,不要忘记将你的 html helper 命名空间发布到 Views Web.config 中,这样 Razor 视图引擎就能找到它了。

1
请特别注意Darin的回答,您将在Views文件夹中的web.config中添加您的命名空间。而不是根Web文件夹中的web.config文件。起初我没有注意到这一点,一段时间后才想通为什么在将我的命名空间添加到根web.config文件后它仍然无法工作。
我认为这也解释了为什么对于那些在HtmlExtensions类中更改其命名空间为System.Web.Mvc的人可以正常工作。因为System.Web.Mvc已经包含在~/Views/web.config文件的命名空间中。

0
如先前所述,正确的命名空间需要在视图文件夹下的 web.config 文件中。默认命名空间会自动包含在视图文件夹下的 web.config 文件中。
如果您的默认命名空间是

 namespace AppName.SomeNamespace

web.config文件已经包含了该条目:

 <add namespace="AppName.SomeNamespace" />

之前没有提到的是,当您在MVC项目中创建一个新文件夹时,命名空间会得到扩展。如果您创建了一个名为Helpers的文件夹,那么这些方法的命名空间将是:
 namespace AppName.SomeNamespace.Helpers

在视图文件夹的web.config文件中,未找到扩展命名空间。

你有两个选择:

  1. 将包含 HTML 辅助方法的文件中的命名空间更改为默认命名空间,即删除“.Helpers”。

  2. 在 Web 配置文件中添加扩展命名空间

    <add namespace="AppName.SomeNamespace.Helpers">
    

0

我们使用VB,遇到了同样的问题。唯一有效的方法是,在_PartialView.vbhtml页面中:

@* Import the project's root namespace *@
@Imports MyRootNamespace

@* Import the Module that contains the HTML Extension Functions *@
@Imports MyHtmlHelperExtensions

@* To use the extension, We have to call the extension function directly 
   Passing the Html (HTML Helper Object) as the first parameter. *@
MyExtensionFunctionName(Html, "Hello World")

作为参考,我们的HTML扩展文件如下所示:

Imports System.Web.WebPages.Html    

Public Module MyHtmlHelperExtensions

    '== Example
    <Extension()>
    Public Function MyExtensionFunctionName(ByVal html As HtmlHelper, ByVal textToDisplay As String) As IHtmlString
         html.Raw(textToDisplay)
    End Function

End Module

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接