Расширение HtmlHelper в .NET 4.0 MVC3 ASPX - PullRequest
2 голосов
/ 31 октября 2011

У меня есть код, который работает в приложении .NET 3.5, который не работает, когда я настраиваю его таким же образом в .NET 4.0.Проблема возникает, когда я пытаюсь расширить HtmlHelper.В .NET 4.0 MVC3, если у меня есть страница, которая выглядит следующим образом:

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of IEnumerable (Of MvcApplication2.MyModel))" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <%=Html.MyTest%>
</asp:Content>

и расширение, подобное этому:

Imports System.Runtime.CompilerServices

Module Extensions

    <Extension()>
    Public Function MyTest(htmlhelper As System.Web.Mvc.HtmlHelper) As String
        Return Now.ToLongTimeString
    End Function

End Module

, оно не будет компилироваться, потому что «HTML»не относится к типу System.Web.Mvc.HtmlHelper, как это было в прошлом, теперь оно относится к типу System.Web.Mvc.HtmlHelper(Of IEnumerable (Of MvcApplication2.MyModel)).Сообщение об ошибке на <%=Html.MyTest%>:

'MyTest' is not a member of 'System.Web.Mvc.HtmlHelper(Of System.Collections.Generic.IEnumerable(Of MvcApplication2.MyModel))'.

Как бы я расширил HtmlHelper в этой конфигурации?Я что-то упустил в моей настройке, что приводит к тому, что «HTML» имеет другой тип, чем это было в прошлом?Я ничего не нашел в Интернете об изменении в поведении, что заставляет меня поверить, что я где-то сделал что-то не так.

ОБНОВЛЕНИЕ:

В отношенииПочему HtmlHelper (из TModel) наследуется от HtmlHelper, почему этот код не работает?

Partial Public Class HtmlHelper

    Public Function MyOtherTest() As String
        Return Now.ToLongTimeString
    End Function

End Class

Ссылка <%=Html.MyOtherTest%> выдает то же сообщение об ошибке.

1 Ответ

3 голосов
/ 31 октября 2011

Представления с типизированными моделями получают типизированные помощники HTML, так что вспомогательные методы могут использовать тип модели.
Однако HtmlHelper(Of TModel) наследует HtmlHelper, поэтому ваш код будет работать нормально.

Возможно, чтоВы добавили ссылку на System.Web.WebPages.dll, так что метод расширения расширяет System.Web.WebPages.HtmlHelper, который является другим классом.

...