0

我想在一个单独的项目中使用 System.Web.Mvc 命名空间中的 ViewPage/HtmlHelper 类。我导入了相关库,然后尝试了这个:

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() 等。我该如何解决这个问题?

4

2 回答 2

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");
    }
}
于 2009-10-04T20:49:22.717 回答
0

Html 助手要求设置 ViewPage 的 ViewContext 属性。通常,在控制器或其他类代码中不是这种情况。

您能否将此 CheckBox 打包在一个 ASCX 文件中,并通过 Html.RenderPartial 方法调用由其他视图引用它?

于 2009-09-13T09:54:06.773 回答