Razor Page–Asp.Net Core 2.0新功能

来源:http://www.cnblogs.com/inday/archive/2017/08/23/razor-page-in-asp-net-core-2.html
-Advertisement-
Play Games

Razor Page介紹前言 上周期待已久的Asp.Net Core 2.0提前發佈了,一下子Net圈熱鬧了起來,2.0帶來了很多新的特性和新的功能,其中Razor Page引起我的關註,作為web程式員來說,Asp.Net下的任何web框架都會去特別關註,因為每次一個新的框架出來,意味著一次革命。... ...


Razor Page介紹

前言

    上周期待已久的Asp.Net Core 2.0提前發佈了,一下子Net圈熱鬧了起來,2.0帶來了很多新的特性和新的功能,其中Razor Page引起我的關註,作為web程式員來說,Asp.Net下的任何web框架都會去特別關註,因為每次一個新的框架出來,意味著一次革命。此次的Razor Page是否能帶來不一樣的體驗呢,讓我們一起來看看吧。

什麼是Razor Page

    我們都知道在Asp.Net MVC中,Razor是其一種視圖引擎。而今天我們介紹的Razor Page卻是一種web框架,它是一種簡化的MVC框架,如果你曾經做過WebForm的開發者,你會發現,Razor Page有點類似Web Form,一個page,一個class。

    大家或許會有疑惑,我們現在Asp.Net MVC已經很完善了,為何還需要出來一種新型的框架呢?在我看來,MVC確實已經足夠強大了,只是因為太強大了,卻變成了它的缺點。當我們的業務越來越龐大的時候,你是否覺得你的一個Controller內部已經凌亂不堪?當我們業務模塊劃分越多的時候,你是否會為你的Model創建而頭疼呢?當我們創建一個新的View的時候,我們需要在MVC層增加1個View,1個Model,修改一個Controller,每當這個時候,我都會疑惑這不是違反Open-Closed Principle(對擴展開放,對修改關閉)了嘛!這個時候我會想起以前的webform,現在不需要了,我們有了Razor Page,一種更輕量級的MVC(我覺得更像MVVM)。

如何創建Razor Page

我們可以通過多種方式來創建Razor Page項目,最簡單的就是利用dotnet命令方式,當然我還是建議您使用Visual Studio 2017(宇宙最強的IDE)。要創建Razor Page,你需要先安裝.Net Core 2.0 SDK,如果要使用VS2017來創建,您還必須要更新到15.3版本以上

dotnet命令方式創建

打開cmd或者powershell工具,先檢查下你的dotnet 版本是否為2.0.0

dotnet –version

先通過命令,到你需要創建項目的目錄,我這裡為E盤下demos目錄:cd e:\demos\RazorPageDemo1

dotnet new razor

輸入以上命令,你就已經創建了razorPage的項目了,這裡說一下dotnet 2.0預設是自動restore的,你也可以通過--no-restore選項關閉。我們直接通過命令dotnet run 可以直接運行,看到的頁面應該跟之前mvc創建的類似。

輸入dir,我們看下生成了哪些:

image

跟之前mvc不同的是,我們不再看到model,view,controller目錄了,取而代之的是Pages目錄,這個就是我們的razor Page的主要工作目錄。

Visual Studio 2017創建Razor Page

用Visual Studio 2017創建是非常方便的(宇宙最強IDE),不過我們必須要先升級到15.3,升級之後選擇新建項目->.Net Core –> Asp.Net Core Web應用程式,接下來會彈出一個對話框,讓我們選擇模板類型:

image

多了好多模板,好興奮啊!我們在這裡無法找到Razor Page,那是因為Razor Page已經變成預設的【Web應用程式模板】了,而傳統的MVC方式已經變成【Web應用程式(模型視圖控制器)】。選擇【Web應用程式模板】,點擊確定我們就完成創建了,通過Solution Explore,我們可以看到:

image

與命令方式創建的一致。

QuickStart Razor Page

Hello Razor Page

通過上節我們創建了Razor Page項目,直接通過dotnet run或者在vs中F5運行。上文中我們說到,Razor Page的項目中,我們的關註點都在Pages目錄下,在VS Explore中,我們看到在Index.cshtml的左邊有一個三角箭頭,點擊就會看到Index.cshtml.cs文件,是不是感覺回到了webform。我們看下代碼:

public class IndexModel : PageModel
{
    public void OnGet()
    {

    }
}

因為我們的Index頁面沒有綁定任何數據,所以這裡基本上只繼承了PageModel,OnGet方法是個約定,查看mvc的源碼你會發現它會獲取On{handler}{Async}()。比如OnGet,它會在Get Index的時候被執行,我們可以通過這個約定進行數據綁定,這裡知道下在Razor Page下HttpMethod也是一個handler,所以Razor Page的處理方式是通過handler進行的。

舉個例子,我們在IndexModel中添加一個String類型的屬性Message,在OnGet中進行賦值:

public void OnGet()
{
    Message = "this is a test!";
}

然後我們修改下Index.csthml:

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="row">
   Message : @Model.Message
</div>

運行下,如果我們在頁面上看到Message : this is a test!,說明賦值成功。

是不是很方便,一般我們的web基本上百分之八十在Get和Post,特別情況會出現其他HttpMethod,當然我們的RazorPage也支持,不過不建議。

現在來說PageModel就是一個Model,Action,HttpMethod的合體,對於Controller使用文件自己的路徑+文件名的方式,比如原先我們的HomeController,預設情況下我們可以通過’/’訪問也可以通過’/Home/’ 訪問,這其實有歧義的,為了避免這種情況,我們必須去修改Route,非常不方便,而現在,我們只需要在Pages主目錄下創建相應的Action就可以了,微軟提供了Razor Page的對應Url關係,如圖:

image

快速自定義Routing

你是否會問現在還支持/Controller/Action/ID 嗎?

支持,不過你需要在cshtml頁面上,通過@page設置路由

@page "{parameter:type?}"

例如 /Address/Province/City  我們只需要在Address/Index.cshtml頁面上加入如下:

@page "{Province}/{City?}"

問號代表可選參數。這樣的好處就是我們不需要在RegisterRoute的時候去填寫規則了,是不是很棒!Flirt male

那像原來我們在一個Controller中,有Get()和Get(id)表示獲取列表和獲取單個Item,那在Razor Page中如何運用呢?

抱歉,目前我沒有找到最佳的解決方法,原本我打算在@page "~/user/{id:int}",但是測試結果發現不支持,因為我們的page對應到url也是一個目錄,@page route的時候它不會識別絕對路徑和相對路徑,它只會在當前路徑後面添加映射,也就是說我們的url變成了/users/user/{id},目前最佳的解決方式是建立兩個目錄,如下:

image


模型綁定

在Razor Page中,數據綁定是非常簡單的, 您只要在需要綁定的屬性上添加[BindProperty]特性即可。

public class IndexModel : PageModel
{
    
    public string Message { get; set; }

    [BindProperty]
    public User TestUser { get; set; }

}

public class User
{
    public Guid UserID { get; set; }

    public  string Name { get; set; }
}

預設情況模型綁定不支持Get方法,你需要使用[BindProperty(SupportsGet=true)]

TempData 臨時數據

TempData是Asp.Net Core 2.0新增的特性,你只需要在PageModel中的屬性上加上TempData特性即可。加上TempData特性的屬性,會在你跳轉路由或者頁面的時候隱性的傳遞過去。

什麼意思呢?比如當你創建一個用戶的時候,你會希望跳轉回用戶列表頁,併在用戶列表頁提示添加成功的信息,這時候你可以通過在Message屬性上加上[TempData]特性,引用下微軟Docs的例子:

public class CreateDotModel : PageModel
{

    [TempData]
    public string Message { get; set; }


    [BindProperty]
    public Customer Customer { get; set; }

    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }
        //todo create a new customer
        Message = $"Customer {Customer.Name} added";
        return RedirectToPage("./Index");
    }
}

跳轉到Index後,我們的IndexModel的Message屬性(需要同樣設置TempData特性)就會被賦值。有點類似於之前的model傳遞,但又不一樣,感覺棒棒噠!

遇到的一些問題

Q:自定義routing的時候,無法支持絕對路徑和相對路徑

A:應該可以通過重寫某個介面達到目的,稍後我會看下

Q:不支持多個handler在同一個pageModel中,比如OnGet, OnGetAsync不能在同一個PageModel中

A:可以通過自己重寫IPageHandlerMethodSelector介面,然後註冊到service中應該可以解決。

Q:用VS2017創建新的Page的時候,會在頁面上顯示紅線

A:關閉頁面再打開。。。。

寫在最後

    最近工作有點忙,Core2.0的出現使Net圈沸騰了,RazorPage的出現更是讓我們這種web開發者為之振奮,今天介紹的有限,畢竟也是剛出來的東西。個人覺得Razor Page還是非常棒的,雖然還有些問題,如果遇到Razor Page無法解決的事情,請大家結合MVC,國外有大神就是這麼做的,但我相信不久之後,Razor Page會瘋狂出現在我們面前,特別是對於微服務架構來說,簡單和快速是微服務的重要所在。

    最後推薦下自己的.Net Core學習群:376248054


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

-Advertisement-
Play Games
更多相關文章
  • 一、文章概述 本演示介紹了WPF的靜態資源和動態資源的基本使用,並對兩者做了簡單的比較。靜態資源(StaticResource)指的是在程式載入記憶體時對資源的一次性使用,之後就不再訪問這個資源了;動態資源(DynamicResource)使用指的是在程式運行過程中然會去訪問資源。 二、定義並使用資源 ...
  • 定義 TemplateBinding是為了某個特定場景優化出來的數據綁定版本--需要把ControlTemplate裡面的某個Property綁定到應用該ControlTemplate的控制項的對應Property上。 用法 區別 1. Binding比TemplateBinding更加靈活強大,但是 ...
  • ASP.NET Core 1.x提供了通過Cookie "中間件" 將用戶主體序列化為一個加密的Cookie,然後在後續請求中驗證Cookie並重新創建主體,並將其分配給 屬性。如果您要提供自己的登錄界面和用戶資料庫,可以使用作為獨立功能的Cookie中間件。 ASP.NET Core 2.x的一個 ...
  • C#,傳入lambda表達式,轉化為where條件sql語句。 ...
  • 一、控制台輸出 在控制台輸出: 1 console.writeline(); 2 console.readkey(); 加上後面一句是為了保證彈窗不會一閃而過。 二、註釋 1.單行註釋: 1 //int a=90; 快捷鍵:Ctrl+K+c 2.多行註釋 2 /* int a=12; float b ...
  • 本系類將會講解asp.net core MVC中的內置全局過濾器的使用,將分為以下章節 asp.net core MVC 過濾器之ExceptionFilter過濾器(一) asp.net core MVC 過濾器之ActionFilter過濾器(二) asp.net core MVC 過濾器之Re ...
  • 由於System.Data.OracleClient.dll從.NET Framework4.0之後已被棄用,所以我們無法在.NET Framework高版本中使用。一番搜索之後,發現好多文章提到.NET連接Oracle需要安裝客戶端,安裝驅動,各種配置...感覺無比麻煩。 Oracle Entit ...
  • 一、 需求描述: mapreduce筆試題: 找出有共同好友的users usr:friend,friend,friend... A:B,C,D,F,E,O B:A,C,E,K C:F,A,D,I D:A,E,F,L E:B,C,D,M,L F:A,B,C,D,E,O,M G:A,C,D,E,F H ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...