6

MVC 3 Razor アプリケーション用に独自のカスタム HTML ヘルパーを作成して使用する方法を詳しく説明している良い例/チュートリアルを見つけようとして Web を閲覧してきました。次のようなものを見つけました。

ASP.NET MVC 3 に独自の HtmlHelper を追加する

クラスを作成しました(少しトリミングしました)

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Linq.Expressions;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;

namespace MyWebApp
{
    public static class ExtensionMethods
    {
         public static MvcHtmlString StateDropDownListFor<TModel, TValue>
                        (this HtmlHelper<TModel> html, 
                                        Expression<Func<TModel, TValue>> expression)
         {
             Dictionary<string, string> stateList = new Dictionary<string, string>()
             {
                {"AL"," Alabama"},
                {"AK"," Alaska"},
                {"AZ"," Arizona"},
                {"AR"," Arkansas"}

              };
              return html.DropDownListFor(expression, 
                       new SelectList(stateList, "key", "value"));
         }

     }
}

ここまでは順調ですね、

コントローラー内に参照も追加しました

using System.Web.Mvc.Html;

今私のビューの中に私は次のものを持っています

@Html.StateDropDownList(x => x.State)

しかし、次のエラーが表示されます

System.web.mvc.htmlhelper<system.collections.generic.list<Profile.ProfileImages>> does     not contain a definition for StateDropDownList and no extension method     StateDropDownList acception a first argument of type     system.web.mvc.htmlhelper<System.Collections.Generic.List<Profile.ProfileImages>> could be      found(Are you missing a using directive of an assembly reference?)

誰かが私がここで間違っていることを教えてください。

4

2 に答える 2

16

ビューに名前空間を含める必要があります。

@using MyWebApp

または、web.config からすべてのビューに対してこの名前空間をインポートできます。

<system.web.webPages.razor>
  <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.Optimization" />
      <add namespace="System.Web.Routing" />
      <add namespace="MyWebApp" />
    </namespaces>
  </pages>
</system.web.webPages.razor>
于 2013-09-21T20:16:22.913 に答える
3

より簡単なオプションは、次のことを行うことだと思います: 1. いつものようにビューを作成し、好きなようにコードと html を組み合わせて、いつものようにヘルパーをそこに配置します。2. ビューを App_Code フォルダーに移動します。3. すべてのビューでヘルプを取得します (_MyHelpers は App_Code フォルダー内のビューの名前であることに注意してください)。

@_MyHelpers.JQMRadioTrueFalse("Voice Mail on your Home Phone?", "HomePhoneHasAnswerPhone", Model.TrueFalse, t.HomePhoneHasAnswerPhone)

これは、上記の任意のビューでアクセスされる App_Code フォルダー内のビューの例です。

    @helper JQMRadioList(string Legend, string RadioListName, List<Fizz.DomainClasses.GenericClasses.GenericDropDownOption> options, bool Horizontal = false, string CurrentSelection = "")
    {
        <fieldset data-role="controlgroup" data-mini="true" data-theme="b" @((Horizontal) ? " data-type=\"horizontal\"" : "")>
            <legend>@Legend:</legend>
            @foreach (var li in options)
            {
                @JQMRadioListItem(RadioListName, li.TheValue, li.Text, CurrentSelection)
            }
        </fieldset>
    }
于 2014-03-03T06:25:47.173 に答える