Не работает метод расширения UrlHelper - PullRequest
2 голосов
/ 31 июля 2010

Я пытаюсь добавить метод расширения в свой проект MVC 2, но безуспешно, и после нескольких часов поиска и поиска здесь я в растерянности.Я создал новый проект MVC 2, чтобы убедиться, что в моем существующем проекте нет ничего странного, и я все еще сталкиваюсь с той же проблемой.Я уверен, что в этой ситуации я «не вижу леса за деревьями», поэтому любая помощь будет принята с благодарностью.Вот код для метода расширения.

using System.Web.Mvc;

namespace ExtensionTest.Helper
{
    public static class UrlExtensions
    {
        public static string Image(this UrlHelper helper, string fileName)
        {
            return helper.Content("~/Content/Images/" + fileName);
        }

    }
}

, а вот код в представлении (стандартное представление домашнего индекса, созданное по умолчанию для нового проекта MVC 2)

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="ExtensionTest.Helper" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <%= UrlHelper.Image("test") %>
    <h2><%: ViewData["Message"] %></h2>
    <p>
        To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
    </p>
</asp:Content>

В режиме конструктора, когда я набираю UrlHelper, intellisense не показывает мой метод расширения Image, и если я запускаю проект, я получаю следующую ошибку:

CS0117: 'System.Web.Mvc.UrlHelper' does not contain a definition for 'Image'

Сначала я думал, что это так же просто, как не добавлятьссылка (оператор импорта), но это не так.Для меня очень странно то, что я могу добавить методы расширения к объекту HtmlHelper без проблем в этом же проекте.

Заранее благодарен за любую предоставленную помощь.

1 Ответ

1 голос
/ 31 июля 2010

Методы расширения в .NET должны вызываться для экземпляра объекта, а не для самого класса (даже если они статические).

Так что вместо:

<%= UrlHelper.Image("test") %>

попробовать:

<%= Url.Image("test") %>
...