2009-07-09 101 views
4

我有翻譯耶利米·克拉克的CheckBoxList Helper for MVC到我的VB.Net項目,但是當我嘗試使用方法在我看來,我得到的錯誤自定義HtmlHelper擴展方法在View中不可用?

'CheckBoxList' is not a member of 'System.Web.Mvc.HtmlHelper(Of Attenda.Stargate.Web.UserRolesViewModel)'. 

誰能告訴我哪裏出了問題?

助手模塊:

Imports System.Runtime.CompilerServices 

Public Module InputExtensions 

    <Extension()> _ 
    Public Function CheckBoxList(ByVal htmlHelper As HtmlHelper, ByVal name As String, ByVal listInfo As List(Of ListItem)) As String 
    Return htmlHelper.CheckBoxList(name, listInfo, DirectCast(Nothing, IDictionary(Of String, Object))) 
    End Function 

    <Extension()> _ 
    Public Function CheckBoxList(ByVal htmlHelper As HtmlHelper, ByVal name As String, ByVal listInfo As List(Of ListItem), ByVal htmlAttributes As Object) As String 
    Return htmlHelper.CheckBoxList(name, listInfo, DirectCast(New RouteValueDictionary(htmlAttributes), IDictionary(Of String, Object))) 
    End Function 

    <Extension()> _ 
    Public Function CheckBoxList(ByVal htmlHelper As HtmlHelper, ByVal name As String, ByVal listInfo As List(Of ListItem), ByVal htmlAttributes As IDictionary(Of String, Object)) As String 
    If String.IsNullOrEmpty(name) Then 
     Throw New ArgumentException("The argument must have a value", "name") 
    End If 
    If listInfo Is Nothing Then 
     Throw New ArgumentNullException("listInfo") 
    End If 
    If listInfo.Count < 1 Then 
     Throw New ArgumentException("The list must contain at least one value", "listInfo") 
    End If 
    Dim sb As New StringBuilder() 
    For Each info As ListItem In listInfo 
     Dim builder As New TagBuilder("input") 
     If info.Selected Then 
     builder.MergeAttribute("checked", "checked") 
     End If 
     builder.MergeAttributes(Of String, Object)(htmlAttributes) 
     builder.MergeAttribute("type", "checkbox") 
     builder.MergeAttribute("value", info.Value) 
     builder.MergeAttribute("name", name) 
     builder.InnerHtml = info.Text 
     sb.Append(builder.ToString(TagRenderMode.Normal)) 
     sb.Append("<br />") 
    Next 
    Return sb.ToString() 
    End Function 

End Module 

查看源代碼:

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/TwoColumn.Master" Inherits="System.Web.Mvc.ViewPage(Of Attenda.Stargate.Web.UserRolesViewModel)" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Edit User Roles 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2>Edit Roles for 
    <%=Html.Encode(Model.User.UserName)%></h2> 
    <div> 
    <%=Html.CheckBoxList("Roles", Model.Roles)%> 
    </div> 
</asp:Content> 
<asp:Content ID="Content3" ContentPlaceHolderID="cphLeftPanel" runat="server"> 
</asp:Content> 

回答

17

您需要包含自定義助手類的命名空間導入到您的視圖頁面。您可以在頁面本身或web.config文件中爲所有頁面執行此操作。首先將代碼放入一個名稱空間中。

<%@ Import Namespace="MyProject.Extensions" %> 

或(在web.config)

<pages> 
    ... 
    <namespaces> 
     ... 
     <add namespace="MyProject.Extensions" /> 
    </namespaces> 
</pages> 
+0

太好了,謝謝:) – Nick 2009-07-09 18:40:30

8

我遇到過這個問題,因爲我還沒有宣佈該模塊是公開的。

這個問題也問here