Повторное использование ViewPage/HtmlHelper в отдельном проекте в ASP.NET MVC с использованием C#

Я хочу использовать класс 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 ответа

Вы пытаетесь назвать свой обычай 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");
    }
}

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

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

Другие вопросы по тегам