2012-05-25 90 views
10

我一直在關注本教程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的定義」。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) 

任何幫助理解。

+0

將您的'EnumDropDownListFor'的第一個參數更改爲'this HtmlHelper htmlHelper' – mattytommo

+0

EnumDropDownListFor html helper是否在控制器中?據我所知,擴展方法應該在一些靜態類中 – VJAI

回答

19

您忘記在視圖內的範圍內使用擴展方法。這個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) 

,並避免將本使用條款,以你的所有的剃刀的觀點,你也可以把它添加到您~/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> 
3

命名空間更改爲

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

這對我有效......不知道爲什麼。我確實看到System.Web.Mvc是web.config中的註冊命名空間之一..但爲什麼我不能添加自己的?沒有任何教程,視頻或我看到的任何內容都提到這一點。我看到它的每一處都說要創建一個名稱空間並將其添加到web.config中。我多次這樣做,甚至認爲我可以使用我的擴展方法(e.q @ Html.MyMethod()),但Intellisense不會撿起它。 – Migs

1

請特別注意Darin的回答,您將在Views文件夾中將您的名稱空間添加到web.config中。 不是web.config文件在您的根web文件夾中。我一開始並沒有注意到它,而且一段時間以來,爲什麼在將我的名稱空間添加到根文件web.config後無效。

我想這也解釋了爲什麼它適用於那些在其HtmlExtensions類中將其名稱空間更改爲System.Web.Mvc的人。 System.Web.Mvc已包含在~/Views/web.config文件的命名空間中。

2

在我的情況我有我的擴展命名空間引用,但缺少System.Web.Mvc.Html使用語句。

(DropDownList控件方法在System.Web.Mvc.Html.SelectExtensions定義)

0

如前所述,正確的命名空間需要在意見文件夾下的web.config文件。默認名稱空間自動包含在views文件夾下的web.config文件中。

如果您的默認命名空間是

namespace AppName.SomeNamespace 

web.config文件中已包含的條目:

<add namespace="AppName.SomeNamespace" /> 

什麼,當你在你的MVC項目中創建一個新的文件夾沒有被之前提到的就是命名空間被擴展。如果你創建了一個名爲幫手,像我一樣的文件夾,然後你對這些方法的命名空間將是:

namespace AppName.SomeNamespace.Helpers 

擴展命名空間是不是在視圖文件夾下的web.config文件中的網絡。

你有兩個選擇:

  1. 變化與HTML輔助方法的默認命名空間通過刪除「.Helpers」的文件中的命名空間。

  2. 擴展命名空間添加到Web配置文件

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

也許問題是,你的HtmlHelper不包含認定中對DropDownList的,因爲中的HtmlHelper在多個名稱空間中定義:System.Web程序。 Mvc和System.Web.WebPages.Html。 System.Web.WebPages.Html命名空間包含HtmlHelper.DropDownList。

此外,別忘了將你的html helper命名空間發佈到Views Web.config中,所以Razor視圖引擎會發現它。

3

由於@ArhiChief暗示在他們的答案,我的問題是:

using System.Web.WebPages.Html; 

相反的:

using System.Web.Mvc; 

這兩者有HtmlHelper定義,所以如果你加錯了一個,你會得到這個錯誤。用正確的名稱空間替換它將會修復它。

相關問題