2012-05-25 50 views
10

Tôi đã theo hướng dẫn này http://blogs.msdn.com/b/stuartleeks/archive/2010/05/21/asp-net-mvc-creating-a-dropdownlist-helper-for-enums.aspx nhưng tôi chạy vào lỗi "System.Web.Mvc.HtmlHelper không chứa định nghĩa cho EnumDropDownListFor".System.Web.mvc.HtmlHelper không chứa định nghĩa cho EnumDropDownListFor

mẫu:

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; } 
} 

Bộ điều khiển:

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) 

Any help is appreciated.

+0

Thay đổi tham số đầu tiên của 'EnumDropDownListFor' thành 'this HtmlHelper htmlHelper' – mattytommo

+0

Trình trợ giúp EnumDropDownListFor html có nằm trong bộ điều khiển không? Các phương pháp mở rộng nên ở trong một số lớp tĩnh như xa như tôi biết – VJAI

Trả lời

19

Bạn quên đưa phương thức tiện ích vào phạm vi bên trong chế độ xem. Phương pháp EnumDropDownListFor này được định nghĩa trong một số lớp tĩnh bên trong một không gian tên, đúng không?

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

Bạn cần phải thêm không gian tên này bên trong cái nhìn mà bạn muốn sử dụng helper này:

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

Và để tránh thêm khoản sử dụng này cho tất cả quan điểm Razor của bạn, bạn cũng có thể thêm nó vào phần <namespaces> của ~/Views/web.config tập tin của bạn:

<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

Thay đổi không gian tên của bạn để

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

Điều này làm việc cho tôi ... không có ý tưởng tại sao. Tôi thấy rằng System.Web.Mvc là một trong những không gian tên đã đăng ký trong web.config .. nhưng tại sao tôi không thể thêm của riêng mình? Không có hướng dẫn, video hoặc bất cứ điều gì tôi thấy đề cập đến điều này. Ở khắp mọi nơi tôi thấy nó nói để tạo ra một không gian tên và thêm nó vào web.config. Tôi đã làm điều này nhiều lần và thậm chí nghĩ rằng tôi có thể sử dụng các phương pháp mở rộng của tôi (e.q @ Html.MyMethod()) Intellisense sẽ không nhặt nó lên. – Migs

1

Chú ý đặc biệt trong câu trả lời của Darin rằng bạn sẽ thêm không gian tên của mình vào web.config trong thư mục Lượt xem. Không phải tệp web.config trong thư mục web gốc của bạn. Tôi đã không nhận thấy nó lúc đầu, và trong một thời gian đã được bối rối là tại sao nó sẽ không hoạt động sau khi thêm không gian tên của tôi vào tập tin gốc web.config.

Tôi nghĩ rằng điều này cũng giải thích lý do tại sao nó hoạt động cho những người thay đổi không gian tên của họ thành System.Web.Mvc trong lớp HtmlExtensions của họ. System.Web.Mvc đã được bao gồm trong các không gian tên trong tệp ~/Views/web.config.

2

Trong trường hợp của tôi, tôi đã có không gian tên của tiện ích mở rộng được tham chiếu, nhưng thiếu câu lệnh using cho System.Web.Mvc.Html.

(Các phương pháp DropDownList được định nghĩa trong System.Web.Mvc.Html.SelectExtensions)

0

Như đã trình bày ở trên, không gian tên đúng cần phải được trong file web.config trong thư mục xem. Không gian tên mặc định được tự động đưa vào tệp web.config trong thư mục views.

Nếu namespace mặc định của bạn là

namespace AppName.SomeNamespace 

Các tập tin web.config đã có chứa các mục:

<add namespace="AppName.SomeNamespace" /> 

gì đã không được đề cập trước đó là khi bạn tạo một thư mục mới trong dự án MVC của bạn không gian tên được mở rộng.Nếu bạn đã tạo một thư mục có tên Helpers, giống như tôi đã làm sau đó không gian tên của bạn cho những phương pháp này sẽ là:

namespace AppName.SomeNamespace.Helpers 

Không gian tên mở rộng không phải là trong các trang web trong file web.config trong thư mục xem.

Bạn có hai lựa chọn:

  1. Thay đổi không gian tên trong file với các phương pháp html helper để không gian tên mặc định bằng cách loại bỏ các ".Helpers".

  2. Thêm không gian tên mở rộng cho các tập tin cấu hình web

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

Có lẽ vấn đề là HtmlHelper của bạn không chứa, định nghĩa cho DropDownList vì HtmlHelper định nghĩa trong một số không gian tên: System.Web. Mvc và System.Web.WebPages.Html. Không gian tên System.Web.WebPages.Html chứa HtmlHelper.DropDownList.

Ngoài ra, đừng quên đăng không gian tên người trợ giúp html của bạn vào Views Web.config, vì vậy, công cụ xem Dao cạo sẽ tìm thấy nó.

3

Như @ArhiChief ám chỉ trong câu trả lời của họ, vấn đề của tôi là:

using System.Web.WebPages.Html; 

Thay vì:

using System.Web.Mvc; 

Cả hai trong số đó có định nghĩa cho HtmlHelper vì vậy nếu bạn thêm một sai lầm, bạn sẽ nhận được lỗi này. Thay thế nó bằng không gian tên chính xác sẽ sửa nó.

Các vấn đề liên quan