0

我为 HTML 自定义扩展添加了一个类:

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

我还在我的网站网络配置中注册了它:

<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" %>

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

4

3 回答 3

2

您可能缺少this关键字:

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

此外,如果在您的目录中检查您的 Web.config 是否Views有类似的内容:

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

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

于 2012-11-28T23:02:09.483 回答
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您应该已经涵盖了。

于 2012-11-28T22:57:21.473 回答
0

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

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

现在完美运行,谢谢!

于 2012-11-29T17:50:41.120 回答