2009-07-09 1 views
4

Я перевел Иеремия Кларк CheckBoxList Helper for MVC в мой проект VB.Net, но когда я пытаюсь использовать метод на мой взгляд, я получаю ошибкуПользовательский метод расширения HtmlHelper недоступен в представлении?

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

Может кто-нибудь сказать мне, где я пошло не так?

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 

Просмотр:

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

+0

@tvanfosson: Каковы эти круглые скобки в '<% @ импорта%>' директивы? Я никогда не видел этот синтаксис и считаю его недопустимым. Это должно быть '<% @ Imports Namespace =" MyProject.Extensions "%>'. –

+0

Недавно я много делал с атрибутами, вы знаете: [Авторизовать (Роли = "...")]. Я удалил их. – tvanfosson

8

Я столкнулся с этой проблемой, потому что я не объявлял модуль будет Public.

Этот вопрос также попросил here

Смежные вопросы