簡體   English   中英

如何在MVC中為所有視圖提供Html助手?

[英]How is Html helper 'available' to all views in MVC?

也許這對程序員來說是一個問題 - 我相信如果有的話,有人會建議我。

當使用MVC時,我也可以訪問Html Helper變量並使用任何擴展方法,無論是.Net的還是我自己指定的。

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

這是如何實現的? 假設我想為了另一個原因添加一個單獨的對象,並將其提供給我的MVC應用程序中的所有視圖?

我知道我無法將其添加到控制器,因為一個視圖可能被多個控制器訪問。

所以我最好的猜測是需要繼承IView?

編輯:抱歉 - 我沒有解釋自己。 至少我認為......

我希望對象可用,但也要實例化。 例如,假設我有一個名為glosrob的對象,使用方法SayHello()並希望能夠如此使用它:

@glosrob.SayHello()

基本上我想避免在每個視圖上添加代碼來構造對象,例如避免這種情況

@{
    var glosrob = new Glosrob();
}

如何在MVC中為所有視圖提供Html助手?

在views文件夾中,您將找到一個單獨的web.config文件。 在配置文件中將是所有視圖派生自的類:

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

因此,所有視圖都派生自WebViewPage類,該類包含一個名為Html的屬性,用於公開HtmlHelper。

假設我想為了另一個原因添加一個單獨的對象,並將其提供給我的MVC應用程序中的所有視圖?

如果您想要暴露自己的自定義屬性,您應該閱讀更改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();

在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>

如果您可以使用共享對象,則可以在靜態類中定義它,並使用上述方法使該類可用。

那么你有幾個選擇。 您可以將您的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>

同時將此選項視為可能的重復: 為Razor View導入命名空間

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM