2009-09-13 7 views
0

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

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() и т.д. Как я могу решить эту проблему?

ответ

0

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

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

+0

Я не понимаю ваш вопрос, что вы имеете в виду? –

+0

@Mr. Смит: Похоже, вы хотите поделиться визуальной штукой (флажок) с другими частями веб-сайта MVC. Эта концепция не должна существовать в рамках определенного класса C# и может быть лучше выражена, если разместить этот флажок в своем собственном, совместном частичном представлении. Он все еще может использоваться другими видами/контроллерами, и, тем не менее, у вас будет прямой доступ к вспомогательным методам Html в частичном представлении. –

+0

Вместо этого я пошел с использованием класса TagBuilder. Я пишу класс, который генерирует теги ввода «на лету» на основе столбцов в DataTable или свойства класса –

1

Вы пытаетесь позвонить своему производителю 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"); 
    } 
}