4

我已将 Jeremiah Clark 的MVC CheckBoxList Helper翻译到我的 VB.Net 项目中,但是当我尝试在我的视图中使用该方法时,我得到了错误

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

2 回答 2

18

您需要将包含自定义帮助程序类的命名空间导入您的视图页面。您可以在页面本身或在所有页面的 web.config 文件中执行此操作。首先将代码放入命名空间。

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

或(在 web.config 中)

<pages>
   ...
   <namespaces>
       ...
       <add namespace="MyProject.Extensions" />
   </namespaces>
</pages>
于 2009-07-09T17:28:15.333 回答
9

我遇到了这个问题,因为我没有将模块声明为公共。

这个问题也在这里问

于 2010-07-02T17:21:07.923 回答