YbSoftwareFactory 代碼生成插件【二十五】:Razor視圖中以全局方式調用後臺方法輸出頁面代碼的三種方法

来源:http://www.cnblogs.com/gyche/archive/2016/06/21/5597491.html
-Advertisement-
Play Games

框架最新的升級實現了一個頁面部件功能,其實就是通過後臺方法查詢資料庫內容,把查詢結果的 HTML 代碼呈現到 Razor 視圖中,考慮到靈活性,需要能在任意 Razor 視圖中調用該方法,這樣任意 Razor 頁面都能以統一的方式方便地共用該頁面部件的 HTML 內容,這對於代碼的重用性和可維護性都... ...


  上一篇介紹了 MVC中實現動態自定義路由 的實現,本篇將介紹Razor視圖中以全局方式調用後臺方法輸出頁面代碼的三種方法。

  框架最新的升級實現了一個頁面部件功能,其實就是通過後臺方法查詢資料庫內容,把查詢結果的 HTML 代碼呈現到 Razor 視圖中,考慮到靈活性,需要能在任意 Razor 視圖中調用該方法,這樣任意 Razor 頁面都能以統一的方式方便地共用該頁面部件的 HTML 內容,這對於代碼的重用性和可維護性都是非常有必要的。

  為實現上述要求,本文介紹如下可供選擇的三種方式。

  1、擴展靜態類 Helper 方法,返回 HtmlString

  1)可參考如下代碼:

public static class ImageHelper
{
  public static HtmlString Image(this HtmlHelper helper, string id, string url, string alternateText)
    {
        return Image(helper, id, url, alternateText, null);
    }

    public static HtmlString Image(this HtmlHelper helper, string id, string url, string alternateText, object htmlAttributes)
    {
        // Instantiate a UrlHelper 
        var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);

        // Create tag builder
        var builder = new TagBuilder("img");

        // Create valid id
        builder.GenerateId(id);

        // Add attributes
        builder.MergeAttribute("src", urlHelper.Content(url));
        builder.MergeAttribute("alt", alternateText);
        builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

        // Render tag
        var ret = new MvcHtmlString(builder.ToString(TagRenderMode.SelfClosing));

        return ret;
    }
}

  2)此時界面可以這樣調用:

@Html.Image("my-id", "~/Content/my-img.png", "Alt Text")

  總結:此方式最簡單,但缺點也非常明顯,因為是靜態類,無法方便的進行依賴註入以調用其他實例方法。

  2、繼承 WebViewPage<TModel> 實現自定義的 WebViewPage ,在子類中實現返回界面 HTML 字元串的方法。

  此種方式可參照Abp框架中多語言的本地化實現過程,步驟如下:

  1)繼承 WebViewPage 類

public abstract class AbpWebViewPage<TModel> : WebViewPage<TModel>

  2)實現方法,返回指定 Key 名稱的本地化語言字元串

/// <summary>
/// Gets localized string for given key name and current language.
/// </summary>
/// <param name="name">Key name</param>
/// <returns>
/// Localized string
/// </returns>
protected virtual string L(string name)
{
    return this._localizationSource.GetString(name);
}

  3)在 Web.config 中配置視圖基類

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="Yb.AbpZero.Web.Views.AbpZeroTemplateWebViewPageBase">
<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="System.Web.Optimization" />
<add namespace="Yb.AbpZero.Web" />
<add namespace="Yb.AbpZero.Localization" />
</namespaces>
</pages>
</system.web.webPages.razor>

  4)這樣視圖頁面上就可以方便的調用 @L("Dashboard") 代碼輸出對應語言的字元串內容

  總結:此種方式需要在指定文件夾下的 Web.config 中配置頁面視圖的基類,在未配置的頁面中無法進行方法的調用

  3、推薦的最佳方案

  我們換種方式實現 Helper 方法,通過使用全局 Razor 視圖中的 Helper 代碼去訪問後臺方法並輸出結果

  1)繼承 System.Web.WebPages.HelperPage ,並重寫 Html 屬性

  此處需要註意的是 System.Web.WebPages.HelperPage 的 Html 對象和如下重寫的 Html 對象不是同一個類,為便於記憶、統一以 MVC Razor 中的關鍵字進行界面調用,我們此處還是把屬性名稱定義為 Html 。

public class HelperPage : System.Web.WebPages.HelperPage
{
    // Workaround - exposes the MVC HtmlHelper instead of the normal helper
    public static new HtmlHelper Html
    {
      get { return ((WebViewPage) WebPageContext.Current.Page).Html; }
    }
}    

  2)把 Helper 方法放到 App_Code 文件夾下的 Razor 視圖中

  我們已經知道Razor可以訪問本路徑下其他 Razor 視圖中定義的 Helper 方法,但現在我們考慮的是任意路徑下 Razor 視圖可均共用該 Helper 方法。

  首先在 App_Code 文件夾下創建一個 Razor 視圖,該視圖將會被進行動態編譯,通過 Razor 的視圖引擎調用後臺方法輸出界面所需的 HTML 代碼,代碼如下:

@inherits YbRapidSolution.Mvc.HelperPage
@using System.Web.Mvc.Html
@helper Partial(string id)
{
    Html.RenderAction("_Widget", "Home", new { id });
}

  3)我們在 _Widget 的後臺方法中來訪問資料庫,然後生成頁面部分視圖並返回至界面,代碼如下:

#region CMS部件呈現

/// <summary>
/// CMS部件呈現
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[ChildActionOnly]
public PartialViewResult _Widget(string id)
{
  if (string.IsNullOrEmpty(id))
  {
    return PartialView("E404");
  }

  var widget = _widgetService.GetById(id);
  if (widget == null)
  {
    return PartialView("E404");
  }
  if (string.IsNullOrWhiteSpace(widget.TemplatePath))
  {
    return PartialView("_Widget", widget);
  }
  return PartialView(widget.TemplatePath, widget);
}

#endregion 

  4)這樣就可在任意頁面進行調用如下代碼生成界面所需的 Html 字元串,而字元串的內容則可放到資料庫中,可在需要的時候在後臺進行修改和維護:

@_Widget.Partial("31dbfb04b41e4883bab880ceec2cfef3")

  總結:此種方式無需額外配置即可實現 Helper 方法的全局共用,調用的時候可以使用自己定義的標簽,代碼可讀性更強。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文: "Adding Validation" 作者: "Rick Anderson" 翻譯: "謝煬(Kiler)" 校對: "孟帥洋(書緣)" 、 "婁宇(Lyrics)" 、 "許登洋(Seay)" 在本章節中你將為 模型類添加驗證邏輯,以確保在用戶試圖創建或編輯影片數據時強制執行驗證規則。 ...
  • “廠長,上一次我們講過了工作流的整體規劃,今天我要動手做啦!我想先把工作流的自定義表單做出來。” “好的,以前我做這方面的東西,我給你設計了一份表結構,你先拿去看看。” “廠長,是不是沒發完,怎麼就一個表?” “我就知道你會這麼問,我現在給你解釋一下重點欄位的含義。” 數據表:將表單上的內容保存到哪 ...
  • 1. 引言 在實際的項目中,樹還是用的比較多的一種,尤其是對於具有層次結構的數據。相信很多人都學過樹的遍歷,比如先序遍歷,後序遍歷等,利用遞歸還是很容易理解的。 今天給大家介紹下二叉樹的幾種遍歷演算法,包括遞歸和非遞歸的實現。 首先建立一棵二叉樹 如: 一棵簡單的二叉樹 2. 先序遍歷 先序遍歷還是很 ...
  • 1、自動屬性,就是一個屬性的簡寫方式,不過後臺編譯時會自動的將屬性的代碼補全 2、可變類型 Var: 其實不是真的可變,而是對於可以推斷出來的強類型對象可以幫我們自動識別。在聲明太複雜的類型是可以使用。或者使用次數不多的情況下 Var編譯時確定類型 Dynamic : 真正的可變類型,在運行階段看你 ...
  • 據說得有楔子 按照慣例,先來幾張樣例圖(註:為了展示視窗陰影效果,截圖範圍向外擴展了些,各位憑想象吧)。 還要來個序 其實,很多年沒寫過Winform了,前端時間在重構我們公司自己的呼叫中心系統,突然就覺得客戶端好醜好醜,對於我這種強迫症晚期患者來說,界面不好看都不知道怎麼寫代碼的,簡直就是種折磨, ...
  • 繼續上篇:EntityFramework和EntityFramework.Extended使用說明——性能,語法和產生的sql 1.監控sql 上篇中的sql監控採用的是 Microsoft SQL Server Management Studio中工具->profiler去監控的.當然,Expre ...
  • 前面Insus.NET實現過《使用ViewModel來實現多個Model傳送至視圖》http://www.cnblogs.com/insus/p/5594134.html 和《使用ExpandoObject來實現多個Model傳送至視圖》http://www.cnblogs.com/insus/p/ ...
  • 1、下載安裝包 Windows6.1-KB963697-x64.msu 2、安裝過程失敗,提示未安裝更新 我是阿裡雲的伺服器,一直出現下麵提示 經過反覆研究,確定系統問題,重新恢復了初始系統,再進行安裝,就成功了。 3、添加媒體服務角色,成功解決。 有時候我們總是把問題想象的複雜,其實非常簡單。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...