2009-07-09 63 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