2009-07-09 35 views
4

私はVB.NetプロジェクトにエレミヤクラークのCheckBoxList Helper for MVCを翻訳していますが、私は私の見解でメソッドを使用しようとすると、私はエラーを取得するビューではカスタムHtmlHelper拡張メソッドを使用できません。

'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ファイルでも行うことができます。まずコードを名前空間に入れてください。

(web.configファイルで)
<%@ Import Namespace="MyProject.Extensions" %> 

または

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

パーフェクトを尋ね、 – Nick

+0

@tvanfosson :)おかげで:これらの括弧は '<%@輸入%>'ディレクティブでは何ですか?私はこの構文を見たことがないし、それが無効だと思う。それは '<%@ Imports Namespace =" MyProject.Extensions "%>'でなければなりません。 –

+0

私は最近、[Authorize(Roles = "...")]という属性を使って多くのことを行ってきました。私はそれらを削除しました。 – tvanfosson

8

私は公開するモジュールを宣言していなかったので、私はこの問題が発生しました。

この質問はまたhere

関連する問題