如何在MVC中为所有视图提供Html助手?

时间:2016-03-16 19:12:41

标签: c# .net asp.net-mvc

对于程序员来说,这可能是一个问题 - 我相信有人会建议我这样做。

当使用MVC时,我也可以访问Html Helper变量并使用任何扩展方法,无论是.Net或我自己指定的扩展方法。

@Html.Raw("<h1>This is my HTML</h1>")

这是如何实现的?假设我想为另一个原因添加一个单独的对象,并将其用于我的MVC应用程序中的所有视图?

我知道我无法将其添加到控制器,因为一个视图可能会被多个控制器访问。

所以我最好的猜测是需要继承IView吗?

编辑:对不起 - 我没有解释自己。至少我认为......

我希望对象可用,但也要实例化。例如,假设我有一个名为glosrob的对象,方法SayHello()并希望能够如此使用它:

@glosrob.SayHello()

基本上我想避免在每个视图上添加代码来构造对象,例如避免这个

@{
    var glosrob = new Glosrob();
}

3 个答案:

答案 0 :(得分:5)

  

如何使用Html帮助程序&#39;对MVC中的所有观点?

在views文件夹中,您将找到一个单独的web.config文件。在配置文件中将是所有视图派生自的类:

<pages pageBaseType="System.Web.Mvc.WebViewPage">

因此所有视图都来自WebViewPage类,其中包含一个名为Html的属性,它暴露了HtmlHelper。

  

说我想添加一个单独的对象用于其他原因并让它可用于我的MVC应用程序中的所有视图?

如果您希望自己定制自定义属性,请阅读Changing Base Type Of A Razor View

首先,您使用自己的属性创建自己的类:

public abstract class CustomWebViewPage : WebViewPage {
  public Glosrob Glosrob { get; set; }

  public override void InitHelpers() {
    base.InitHelpers();
    Glosrob = new Glosrob ();
  }
}

并更新您的配置:

<pages pageBaseType="MyProject.Web.CustomWebViewPage">

然后你可以在你的视图中调用它:

 @Glosrob.SomeMethod();

答案 1 :(得分:1)

在views文件夹中,您将找到一个单独的web.config文件。在此文件中,您可以声明需要导入的名称空间。您正在寻找的部分是:

<system.web.webPages.razor>
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
            <add namespace="System.Web.Mvc" />
            <add namespace="System.Web.Mvc.Ajax" />
            <add namespace="System.Web.Mvc.Html" />
            <add namespace="System.Web.Routing" />
        </namespaces>
    </pages>
</system.web.webPages.razor>

如果您想导入自己的对象,可以在此部分添加任何命名空间,它将在您的Razor视图中提供

编辑:如果您需要为每个视图提供特定实例,则需要提供自己的视图实现。您可以通过继承WebViewPage来执行此操作:

public class MyViewPage : WebViewPage
{
    // implement property here
}

public class MyViewPage<TModel> : WebViewPage<TModel>
{
    // implement property here
}

请注意,您需要提供通用AND非泛型版本的实现。之后,您需要确保View Engine将其用作基页。在上面提到的部分中,您将执行以下操作:

<system.web.webPages.razor>
    <pages pageBaseType="<the.name.space>.MyViewPage">
    ...
    </pages>
</system.web.webPages.razor>

如果您可以使用共享对象,则可以在静态类中定义它,并使用上述方法使该类可用。

答案 2 :(得分:1)

嗯,你有几个选择。您可以将您的Html Helper类放在System.Web.Mvc命名空间中,如

    namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {

您还可以在每个页面上导入命名空间:

<%@ Import Namespace="MvcApplication1.Helpers" %>

或者您可以在web.config中注册

<namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="MyHelper"/>

  </namespaces>

同时将此视为可能重复: Import Namespace for Razor View