在视图mvc3 asp.net中看不到HtmlHelperExtensions

时间:2012-11-28 22:54:43

标签: asp.net-mvc asp.net-mvc-3 html-helper

我为HTML Custom Extensions添加了一个类:

using System;
using System.Linq.Expressions;
using System.Text;
using System.Web.Mvc;
using System.Web.Mvc.Html;

namespace App.MvcHtmlHelpers    
{
public static class HtmlHelperExtensions
{

    public static MvcHtmlString ComboBox(HtmlHelper html, string name, SelectList items, string selectedValue)
    {
        var sb = new StringBuilder();
        sb.Append(html.DropDownList(name + "_hidden", items, new { @style = "width: 200px;", @onchange = "$('input#" + name + "').val($(this).val());" }));
        sb.Append(html.TextBox(name, selectedValue, new { @style = "margin-left: -199px; width: 179px; height: 1.2em; border: 0;" }));
        return MvcHtmlString.Create(sb.ToString());
    }

    public static MvcHtmlString ComboBoxFor<TModel, TProperty>(HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression, SelectList items)
    {
        var me = (MemberExpression)expression.Body;
        var name = me.Member.Name;

        var sb = new StringBuilder();
        sb.Append(html.DropDownList(name + "_hidden", items, new { @style = "width: 200px;", @onchange = "$('input#" + name + "').val($(this).val());" }));
        sb.Append(html.TextBoxFor(expression, new { @style = "margin-left: -199px; width: 179px; height: 1.2em; border: 0;" }));
        return MvcHtmlString.Create(sb.ToString());
    }

我也在我的网站web config中注册了它:

<namespaces>
<add namespace="System.Web.Helpers" /> 
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />        
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages" />
<add namespace="App.MvcHtmlHelpers"/>
</namespaces>

在我看来,我导入名称空间:

<%@ Import Namespace="RSPWebApp.MvcHtmlHelpers" %>

但是当我在视图中调用它时,它无法识别自定义扩展。有人可以通过告诉我可能错过的内容来帮助我吗?非常感谢提前!     &lt;%:Html.ComboBoxFor(a =&gt; a.Street2,streetAddressListItems)%&gt;

3 个答案:

答案 0 :(得分:2)

您可能缺少this关键字:

public static MvcHtmlString ComboBox(this HtmlHelper html, string name, SelectList items, string selectedValue)

另外,如果检查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="RSPWebApp.MvcHtmlHelper" />
      </namespaces>
    </pages>
</system.web.webPages.razor>

似乎不是项目Web.config,而是必须在Views文件夹中将命名空间显式添加到Razor引擎本身。

答案 1 :(得分:0)

您在扩展程序中错过了this关键字。试试这个:

public static MvcHtmlString ComboBox(this HtmlHelper html, string name, SelectList items, string selectedValue)
    {
        var sb = new StringBuilder();
        sb.Append(html.DropDownList(name + "_hidden", items, new { @style = "width: 200px;", @onchange = "$('input#" + name + "').val($(this).val());" }));
        sb.Append(html.TextBox(name, selectedValue, new { @style = "margin-left: -199px; width: 179px; height: 1.2em; border: 0;" }));
        return MvcHtmlString.Create(sb.ToString());
    }

此外,您提供的Import Namespace似乎与您的扩展程序的名称空间不同。但是,无论如何,将它们添加到web.config都应该包括在内。

答案 2 :(得分:0)

感谢大家的帮助。我确实错过了我的HTMLHelper类中的“this”关键字(它最初在我的resharper中显示为红色,所以我不应该一直相信它!)

我将它添加到Views文件夹中的web.config(虽然奇怪的是它显示为灰色)。为了回答之前的评论,我实际上正在使用ASP.Net视图,因为我是MVC的新手并且不想与Razor + MVC搏斗。

现在效果很好,谢谢!