2009-07-09 3 views
4

J'ai traduit Jeremiah Clark CheckBoxList Helper for MVC dans mon projet VB.Net mais lorsque je tente d'utiliser la méthode à mon avis j'obtiens l'erreurMéthode d'extension HtmlHelper personnalisée non disponible dans View?

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

Quelqu'un peut-il me dire où je suis allé mal?

Helper:

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 

source Vue:

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

Répondre

17

Vous devez importer l'espace de noms contenant la classe d'aide personnalisée dans votre page vue. Vous pouvez le faire sur la page elle-même ou dans le fichier web.config pour toutes les pages. Placez le code dans un espace de noms en premier.

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

ou (dans le web.config)

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

Parfait, merci :) – Nick

+0

@tvanfosson: Quels sont les parens dans la directive '<% @% Importations>'? Je n'ai jamais vu cette syntaxe et je pense qu'elle est invalide. Il devrait être '<% @ Imports Namespace =" MyProject.Extensions "%>'. –

+0

J'ai beaucoup fait avec les attributs récemment, vous savez: [Authorize (Roles = "...")]. Je les ai enlevés. – tvanfosson

8

j'ai rencontré ce problème parce que je ne l'avais pas déclaré le module à public.

Cette question a également demandé here

Questions connexes