Повторное использование 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?