12

我一直在关注本教程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)
4

8 回答 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)

为了避免将此 using 子句添加到所有 Razor 视图中,您还可以将其添加到文件的<namespaces>部分~/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="AppName.SomeNamespace" />
      </namespaces>
    </pages>
</system.web.webPages.razor>
于 2012-05-26T07:31:42.097 回答
5

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

using System.Web.WebPages.Html;

代替:

using System.Web.Mvc;

两者都有定义,HtmlHelper所以如果你添加错误的,你会得到这个错误。用正确的命名空间替换它会修复它。

于 2015-01-19T17:20:01.350 回答
4

将您的命名空间更改为

namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {
...
于 2012-09-28T13:40:11.240 回答
2

也许问题在于您HtmlHelper不包含定义 forDropDownList因为HtmlHelper在多个命名空间中定义:System.Web.MvcSystem.Web.WebPages.Html. 命名System.Web.WebPages.Html空间包含.HtmlHelper.DropDownList

另外,不要忘记将您的 html 帮助器命名空间发布到 Views Web.config 中,这样,Razor 视图引擎会找到它。

于 2014-10-01T13:14:59.023 回答
2

在我的情况下,我引用了我的扩展命名空间,但缺少 System.Web.Mvc.Html 的 using 语句。

(DropDownList 方法在 System.Web.Mvc.Html.SelectExtensions 中定义)

于 2013-07-05T14:18:27.593 回答
1

在 Darin 的回答中要特别注意,您将把命名空间添加到Views文件夹中的 web.config 中。不是您的web.config根 Web 文件夹中的文件。web.config一开始我并没有注意到它,有一段时间我很困惑为什么在将我的命名空间添加到根文件后它不起作用。

我认为这也解释了为什么它适用于那些将命名空间更改为System.Web.MvcHtmlExtensions 类的人。System.Web.Mvc已包含在~/Views/web.config文件的命名空间中。

于 2012-12-25T15:11:22.987 回答
0

如前所述,正确的命名空间需要位于 views 文件夹下的 web.config 文件中。默认命名空间自动包含在 views 文件夹下的 web.config 文件中。

如果您的默认命名空间是

 namespace AppName.SomeNamespace

web.config 文件已包含以下条目:

 <add namespace="AppName.SomeNamespace" />

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

 namespace AppName.SomeNamespace.Helpers

扩展的命名空间不在views文件夹下的web.config文件中的web中。

你有两个选择:

  1. 通过删除“.Helpers”,使用 html 帮助方法将文件中的命名空间更改为默认命名空间。

  2. 将扩展命名空间添加到 Web 配置文件

    <add namespace="AppName.SomeNamespace.Helpers">
    
于 2014-08-03T00:25:48.967 回答
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
于 2020-04-18T19:30:59.023 回答