2012-11-28 32 views
0

我添加了一個類的HTML自定義擴展可見:HtmlHelperExtensions不考慮MVC3 asp.net

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配置:

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

但是當我去調用它的觀點,它不承認自定義extensi上。有人可以幫我告訴我我可能錯過了什麼嗎?非常感謝! <%:Html.ComboBoxFor(A = > a.Street2,streetAddressListItems)%>

回答

0

感謝大家的全力幫助。我確實在我的HTMLHelper類中錯過了「this」關鍵字(它最初在我的resharper中出現了紅色,所以我不應該相信這一切!)

然後我將它添加到我的web.config中視圖文件夾(雖然奇怪它是灰色的)。爲了回答以前的評論,我實際上使用了ASP.Net視圖,因爲我是MVC的新手,並且不想與Razor + MVC摔跤。

現在完美,謝謝!

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

您可能忽略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> 

看來,代替項目Web.config,您必須在Views文件夾中將名稱空間顯式添加到Razor引擎本身。

+0

我不認爲我們可以判斷OP是否使用Razor視圖。 – MushinNoShin

+0

@JofryHS,是正確的,你錯過了「這個」關鍵字,並把參考放在錯誤的Web.Config – MVCKarl