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

私の場合、拡張機能の名前空間を参照していましたが、System.Web.Mvc.Htmlのusingステートメントがありませんでした。

(DropDownListメソッドはSystem.Web.Mvc.Html.SelectExtensionsで定義されています)

于 2013-07-05T14:18:27.593 に答える
2

おそらく問題は、いくつかの名前空間で定義されているため、の定義HtmlHelperが含まれていないことです。名前空間には。が含まれます。DropDownListHtmlHelperSystem.Web.MvcSystem.Web.WebPages.HtmlSystem.Web.WebPages.HtmlHtmlHelper.DropDownList

また、HTMLヘルパー名前空間をViews Web.configに投稿することを忘れないでください。そうすれば、Razorビューエンジンがそれを見つけます。

于 2014-10-01T13:14:59.023 に答える
1

ビューフォルダのweb.configに名前空間を追加するというDarinの回答に特に注意してください。ルートWebフォルダ内のファイルではありません。web.config最初は気づかなかったのですが、名前空間をルートweb.configファイルに追加した後、なぜ機能しないのか、しばらくの間困惑していました。

System.Web.Mvcこれは、名前空間をHtmlExtensionsクラスに変更した人にとっても機能する理由でもあると思います。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にはありません。

2つのオプションがあります。

  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 に答える