将自定义HTML Helper添加到MVC项目

时间:2013-09-21 20:14:08

标签: c# asp.net-mvc asp.net-mvc-3 razor html-helper

我一直在浏览网页,试图找到一个很好的示例/教程,详细说明如何为我的MVC 3 Razor应用程序创建和使用我自己的自定义HTML帮助程序我发现这个如下

Adding your own HtmlHelper in ASP.NET MVC 3

我已经创建了一个类(稍微修剪了一下)

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?)

有人可以告诉我这里我做错了什么。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>
    }