[asp.net mvc 奇淫巧技] 02 - 巧用Razor引擎在Action內生成Html代碼

来源:http://www.cnblogs.com/emrys5/archive/2017/05/24/asp-net-mvc-2-action-razor.html
-Advertisement-
Play Games

在web開發中經常會遇到在內部代碼中獲取Html,這些Html是需要和數據進行一起渲染。並不是直接把Html代碼返回給客戶端。這樣的做法有很多應用場景,例如分頁、Ajax一次性獲取幾段Html片段、生成郵件發送模板、生成Html靜態頁面等等。比較簡單的或者容易想到的做法就是直接拼接Html,當然這肯 ...


  在web開發中經常會遇到在內部代碼中獲取Html,這些Html是需要和數據進行一起渲染。並不是直接把Html代碼返回給客戶端。這樣的做法有很多應用場景,例如分頁、Ajax一次性獲取幾段Html片段、生成郵件發送模板、生成Html靜態頁面等等。比較簡單的或者容易想到的做法就是直接拼接Html,當然這肯定不是最合適的做法。

應用場景

1、在分頁中,有一種做法是用ajax獲取table的html代碼和一些分頁信息的Json

var json = {
    "table": "<table><tr/><td>1</td></tr></table>",
    "pageSize": 10,
    "currentIndex": 1,
    "count": 100
}

 

2、Ajax一次性獲取幾段Html片段

var json = {
    "leftHtml": "<div><h1>HHHHHHHHHH</h1></div>",
    "rightHtml": "<table><tr/><td>1</td></tr></table>"
}

 

3、生成郵件發送模板、生成Html靜態頁面

  我們經常會生成一些郵件模板,比如推廣一些產品的html代碼。

  生成Html靜態頁面就更加常用了。

 

應用場景分析

  我們這些應用都是在內部代碼中生成html,然後在對html代碼進行處理,比如拼接成json,或者發送郵件,在或者生成靜態html頁面。

  生成Html在asp.net中莫過於Razor引擎,總之就是很好用,語法也很強大,如果我們把需要生成的html用Razor引擎生成豈不是很好,如果熟悉asp.net mvc 管道的話就可以很簡單的解決這個問題。

1、查找View(cshtml)

可以用ViewEngines.Engines.FindView查找View。

public virtual ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName);

FindView需要ControllerContext、viewName和masterName,其中masterName是母版視圖的名稱目前可以忽略。

viewName就是我們需要查找的View,查找View的方式和在Action中return View(string viewName)的方式一致,也就是說有兩種方式,一個是全路徑,如:"~/Views/Home/Html1.cshtml",必須帶尾碼名cshtml。還有一種方式是直接寫"Html1",也就是相對路徑, 如果cshtml文件的位置不在Controller所對應的文件夾中,則可以寫"../Folder/Html1"。此方式同樣適應於普通執行Controller中Action直接return View(string viewName)。

ControllerContext是封裝有關與指定的 System.Web.Routing.RouteBase 和 System.Web.Mvc.ControllerBase 請求的信息

public ControllerContext(RequestContext requestContext, ControllerBase controller);

在構造函數中需要RequestContext和ControllerBase,ControllerBase就是this,RequstContext可以在Action中和容易的獲取。

最終查找View的代碼

ControllerContext context = new ControllerContext(Request.RequestContext, this);
ViewEngineResult result = ViewEngines.Engines.FindView(context, "Html1", "");

 

2、Render View

最終我們需要執行View的Render方法,來獲取生成的html

void Render(ViewContext viewContext, TextWriter writer);

Render 代碼

using (var sw = new StringWriter())
{
    var viewContext = new ViewContext(context, result.View, context.Controller.ViewData, context.Controller.TempData, sw);
    result.View.Render(viewContext, sw);

    string html = sw.ToString(); 
}

代碼中html就是我們需要獲取的html。

 

傳遞數據至View

如何傳遞數據至View,這個和普通的Action執行一致,也就是說我們熟悉的ViewBag,ViewData,TempData以及Model都可以用。

1、設置數據

在調用View.Render前設置數據即可。

context.Controller.ViewBag.Name = "Emrys"; 
context.Controller.ViewData["Age"] = 10;
context.Controller.TempData["City"] = "上海"; 
context.Controller.ViewData.Model = new UserInfo { Name = "Emrys", Age = 10, City = "上海" };

 

2、在View(html)獲取數據,也就是Html1.cshtml中的Razor代碼。

@{
    Layout = null;
} 
@model UserInfo 

Name:@ViewBag.Name<br />

Age:@ViewData["Age"]<br />

City:@TempData["City"]<br />

Name:@Model.Name<br />
Age:@Model.Age<br />
City:@Model.City

 

總結

最終Action中的代碼

ControllerContext context = new ControllerContext(Request.RequestContext, this);
ViewEngineResult result = ViewEngines.Engines.FindView(context, "Html1", "");

context.Controller.ViewBag.Name = "Emrys";
context.Controller.ViewData["Age"] = 10;
context.Controller.TempData["City"] = "上海";
context.Controller.ViewData.Model = new UserInfo { Name = "Emrys", Age = 10, City = "上海" };

using (var sw = new StringWriter())
{
    var viewContext = new ViewContext(context, result.View, context.Controller.ViewData, context.Controller.TempData, sw);
    result.View.Render(viewContext, sw);

    string html = sw.ToString(); 
}

這樣我們就可以巧用Razor獲取我們需要和數據組合的html代碼,以供我們使用。

最後望對各位有所幫助,本文原創,歡迎拍磚和推薦。  


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

-Advertisement-
Play Games
更多相關文章
  • 1、備份資料庫 Mysqldump –u用戶名 –p密碼 備份資料庫 > 備份資料庫.sql 如:mysqldump –uroot –proot zzl > zzl.sql 2、停止mysql服務 Service mysql stop 3、使用yum刪除 Yum remove mysql* 詢問是否 ...
  • UART0串口調試過程:1、配置DTS節點 在Z:\rk3399\kernel\arch\arm64\boot\dts\rockchip路徑下打開rk3399.dtsi文件,裡面已經有UART0相關節點定義,如下所示: uart0: serial@ff180000 { compatible = "r ...
  • 前言 查詢了一下關於 MVC 中的模型綁定,大部分都是關於如何使用的,以及模型綁定過程中的一些用法和概念,很少有關於模型綁定的內部機制實現的文章,本文就來講解一下在 ASP.NET Core MVC 中模型綁定是如何實現的,以及它的一些其他用法。 模型綁定的用途 通常情況下,我們在使用 MVC 框架 ...
  • 首寫博客練練手,第一節基礎中的基礎,覺得太簡單的直接跳過啊,哈哈,IDE是VS2012英文版~~ 1.啟動vs2012,選擇file(文件)>new(新建)>project(項目) 2.項目類型選visual c#,模版選console application(控制台應用程式),項目名稱輸入Hell ...
  • 應用程式分層設計 應用程式分層屬於關註點分離的一種形式,可以通過命名空間、文件夾或採用單獨的項目來實現。 下圖為一個採用分層設計的項目結構 ASPPatterns.Chap3.Layered.Repository依賴於ASPPatterns.Chap3.Layered.Model ASPPatter ...
  • 1.代碼是轉載的,此處記錄一下。 ...
  • 在做一個流程的時候,碰到了下麵的表數據直接從上表中獲取,並且為不可編輯狀態,沒有增加和刪除行的按鈕。一開始使用的是ComputationRule屬性,但是有一項是日期空間,沒有這個屬性,不知道怎麼處理,下麵是官方論壇給出的處理例子:在表單中,控制項類型為子表的數據項,其對於的前臺代碼其實就是Table ...
  • 1.在web中瀏覽pdf文件。 2.支持大多數主流瀏覽器,包括IE8 3.參考網址: https://pdfobject.com/ http://mozilla.github.io/pdf.js/ 引用的js文件下載地址:http://download.csdn.net/detail/wz12288 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...