我一直在关注本教程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 Helper:
@Html.EnumDropDownListFor(model => model.Code.Codes)
答案 0 :(得分:25)
您忘记将扩展方法放在视图内的范围内。这个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>
答案 1 :(得分:5)
正如@ArhiChief在答案中暗示的那样,我的问题是:
using System.Web.WebPages.Html;
而不是:
using System.Web.Mvc;
两者都有HtmlHelper
的定义,因此如果添加错误的定义,您将收到此错误。用正确的命名空间替换它将修复它。
答案 2 :(得分:3)
将名称空间更改为
namespace System.Web.Mvc
{
public static class HtmlExtensions
{
...
答案 3 :(得分:2)
在我的情况下,我引用了扩展名称空间,但缺少System.Web.Mvc.Html的using语句。
(DropDownList方法在System.Web.Mvc.Html.SelectExtensions中定义)
答案 4 :(得分:2)
可能问题是,由于HtmlHelper
在多个名称空间中定义了DropDownList
,因此HtmlHelper
不包含System.Web.Mvc
的定义:System.Web.WebPages.Html
和System.Web.WebPages.Html
。 HtmlHelper.DropDownList
命名空间包含{{1}}。
另外,不要忘记将您的html帮助程序命名空间发布到Views Web.config中,因此,Razor视图引擎会找到它。
答案 5 :(得分:1)
在Darin的回答中要特别注意,您将把名称空间添加到 Views 文件夹中的web.config。 不根网站文件夹中的web.config
文件。我一开始并没有注意到它,并且暂时不知道为什么在将我的命名空间添加到根web.config
文件后它不起作用。
我认为这也解释了为什么它适用于那些在HtmlExtensions类中将命名空间更改为System.Web.Mvc
的人。 System.Web.Mvc
已包含在~/Views/web.config
文件的名称空间中。
答案 6 :(得分:0)
如前所述,正确的命名空间需要位于views文件夹下的web.config文件中。默认命名空间自动包含在views文件夹下的web.config文件中。
如果您的默认命名空间是
namespace AppName.SomeNamespace
web.config文件已包含条目:
<add namespace="AppName.SomeNamespace" />
之前未提及的是,当您在MVC项目中创建新文件夹时,命名空间会被扩展。如果您创建了一个名为Helpers的文件夹,就像我一样,那么这些方法的命名空间将是:
namespace AppName.SomeNamespace.Helpers
扩展命名空间不在web文件夹下的web.config文件中。
您有两种选择:
通过删除&#34; .Helpers&#34;将文件中的命名空间与html帮助器方法更改为默认命名空间。
将扩展名称空间添加到Web配置文件
<add namespace="AppName.SomeNamespace.Helpers">
答案 7 :(得分: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