我为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;
答案 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搏斗。
现在效果很好,谢谢!