Повторное использование ViewPage / HtmlHelper в отдельном проекте в ASP.NET MVC с использованием C # - PullRequest
0 голосов
/ 13 сентября 2009

Я хочу использовать класс ViewPage / HtmlHelper в пространстве имен System.Web.Mvc в отдельном проекте. Я импортировал соответствующие библиотеки, а затем попробовал это:

using System.Web.Mvc;
using System.Web.Mvc.Resources;
using System.Web.Mvc.Html;

public static class Display
{
    public static string CheckBox()
    {
         ViewPage viewPage = new ViewPage();
         return viewPage.Html.CheckBox("Test");
    }
}

Который я так называю в другом классе, который включает мой класс отображения:

string Checkbox = Display.CheckBox():

Это прекрасно компилируется, однако при запуске я получаю:

System.NullReferenceException: объект ссылка не установлена ​​на экземпляр объект.

Я просто хочу использовать методы расширения HtmlHelper как есть, например: page.Html.ActionLink (), page.Html.Radionbutton () и т. Д. Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 05 октября 2009

Вы пытаетесь позвонить своему обычному CheckBox() из другого места, чем вид? Пожалуйста, не делай этого. Философия ASP.NET MVC заключается в том, что ваш контроллер должен подготовить все данные для представления, а затем представление должно решить, как его отобразить.

Если вы измените свой метод на метод расширения, вы можете сделать это:

public static class Display // class name really don't matter for extension methods
{
    public static string CheckBox(this HtmlHelper html)
    {
         return html.CheckBox("Test");
    }
}

В поле зрения:

<%= Html.CheckBox() %>

Обратите внимание, что это может вызвать конфликт имен с существующими методами расширения. Один из способов избежать этого - создать что-то вроде:

Новый код в поле зрения:

<%= Html.Display().CheckBox() %>

Новый добавочный код:

public static DisplayExtension
{
    public static Display(this HtmlHelper html)
    {
        return new Display(html);
    }
}


public class Display // no longer static
{
    private readonly HtmlHelper html;

    public string Display(HtmlHelper html)
    {
         this.html = html;
    }

    public string CheckBox()
    {
         return html.CheckBox("Test");
    }
}
0 голосов
/ 13 сентября 2009

Помощники HTML требуют, чтобы было установлено свойство ViewContext ViewPage. Как правило, это не относится к контроллеру или коду другого класса.

Не могли бы вы упаковать этот CheckBox в файл ASCX и ссылаться на него там с помощью других представлений с помощью вызова метода Html.RenderPartial?

...