學習ASP.NET Core Razor 編程系列四——Asp.Net Core Razor列表模板頁面

来源:https://www.cnblogs.com/chillsrc/archive/2018/04/04/8717199.html
-Advertisement-
Play Games

介紹asp.net core創建的列表模板頁面與一些佈局信息。 ...


學習ASP.NET Core Razor 編程系列目錄

學習ASP.NET Core Razor 編程系列一

學習ASP.NET Core Razor 編程系列二——添加一個實體

 學習ASP.NET Core Razor 編程系列三——創建數據表及創建項目基本頁面

 

本篇文章介紹上一篇文章中創建的書籍信息管理系統中增刪改查的四個Razor模板頁面。

一、列表頁面。

       我們首先來瞭解一下書籍列表頁面,這個頁面位置在 Pages/Books/Index.cshtml.cs :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using RazorMvcBooks.Models; 

namespace RazorMvcBooks.Pages.Books
{
    public class IndexModel : PageModel
    {
        private readonly RazorMvcBooks.Models.BookContext _context;

         public IndexModel(RazorMvcBooks.Models.BookContext context)
        {
            _context = context;
        }
        public IList<Book> Book { get;set; } 

        public async Task OnGetAsync()
        {
            Book = await _context.Book.ToListAsync();
        }
    }
}

 

        列表頁面IndexModel派生自 PageModel。 按照命名規則PageModel 的派生類一般命名為 <PageName>Model。 構造函數使用依賴關係註入的方式將 BookContext 添加到頁面。 所有通過上一文章中的方法創建的模板頁面都是如此。

         當Index頁面發出請求時,OnGetAsync 方法向 Razor 頁面返回一個書籍列表。 在 Razor 頁面上調用 OnGetAsync 方法或 OnGet方法初始化頁面數據。 在本示例中,OnGetAsync 將資料庫中Book表中的所有書籍信息,並以列表的形式顯示出來。

         當 OnGet 方法返回 void 或 OnGetAsync方法返回 Task 時,不需要任何返回語句。 當返回類型是 IActionResult 或 Task<IActionResult> 時,必須提供返回語句。

          下麵我們介紹一下有返回的方法,例如 Pages/Movies/Create.cshtml.cs 頁面中的OnPostAsync方法,代碼如下:

  public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }
 

            _context.Book.Add(Book);
            await _context.SaveChangesAsync(); 

            return RedirectToPage("./Index");
        }

 

 

           其次,我們來看看書籍列表頁面中的前端代碼,這個頁面位置在 Pages/Books/Index.cshtml,在Visual Studio  2017中使用滑鼠左鍵雙擊打開 頁面,代碼如下:

@page
@model RazorMvcBooks.Pages.Books.IndexModel

@{
    ViewData["Title"] = "Index";
}

<h2>Index</h2>
<p>
    <a asp-page="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Book[0].Name)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Book[0].ReleaseDate)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Book[0].Author)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Book[0].Price)
                </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model.Book) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ReleaseDate)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Author)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> |
                <a asp-page="./Details" asp-route-id="@item.ID">Details</a> |
                <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a>
            </td>
        </tr>

}
    </tbody>
</table>

        Razor指令可以根據規則從 HTML 轉換為 C# 或 Razor 特定標記。 當在 @ 符號後跟 Razor 保留關鍵字時,它會轉換為 Razor 特定標記,如果不是Razor保留關鍵字,則會轉換為 C#。

         @page Razor 指令將文件轉換為一個 MVC 操作,這意味著它可以處理請求。 @page 必須是頁面上的第一個 Razor 指令。 @page 是轉換成 Razor 特定標記的一個示例。

          請查看下列HTML助手中使用的lambda表達式:

   @Html.DisplayNameFor(model => model.Book[0].Name)

            DisplayNameFor HTML輔助助手檢查 Lambda 表達式中引用的Name屬性來確定顯示名稱。 Lambda表達式是檢查而不是求值。 這意味著當 model、model.Book 或 model.Book[0] 為 null 或為空時,不會存在任何訪問衝突。 當使用Html輔助助手取值輔助方法對 Lambda 表達式取值(例如,使用 @Html.DisplayFor(modelItem => item.Title)),將取得該實體的屬性值。

       @model指令

@page
@model RazorMvcBooks.Pages.Books.IndexModel

            @model 指令指定傳遞給 Razor 頁面的實體類型。在上面的示例中,@model 使 PageModel 派生的類IndexModel可用於 Razor 頁面。 在頁面上通過 @Html.DisplayNameFor 和 @Html.DisplayName HTML 輔助助手使用該實體。

 

ViewData 和佈局

           首先,我們看一下下麵的佈局代碼:

@page
@model RazorMvcBooks.Pages.Books.IndexModel

@{
    ViewData["Title"] = "Index";
}

           上面的代碼就是 Razor 代碼轉換為 C# 的一個示例。 大括弧“{ }” 字元括住 C# 代碼塊。

             PageModel 基類具有 ViewData 字典屬性,可用於添加要傳遞到某個視圖的數據。 可以使用鍵/值模式將對象添加到 ViewData 字典。 在上面的示例中,“Title”屬性被添加到 ViewData 字典中。 “Title”屬性的在 Pages/_Layout.cshtml 文件中使用。

               你可以在Visual Studio 2017中打開 位於 Pages/_Layout.cshtml 文件,我們來看看這個文件中的前幾行,便可以發現 “Title”的使用。代碼如下。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - RazorMvcBooks</title> 

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
</environment> 

    @*Markup removed for brevity.*@

          行 @*Markup removed for brevity.*@ 為 Razor 註釋。 與 HTML 註釋不同 (<!-- -->),Razor 註釋不會發送到客戶端。

           在Visual Studio 2017 中按F5運行應用程式,在瀏覽器測試項目中的鏈接(Home、About、Contact、Create、Edit和Delete)。你會發現在瀏覽器中每個頁面的標題都是一樣的。當您將某個頁面添加到書簽時,標題用於這個書簽。 Pages/Index.cshtml 和 Pages/Books/Index.cshtml 當前具有相同的標題,但可以修改它們以具有不同的值。

 

            我們可以在Visual Studio 2017中打開 位於  Pages/_ViewStart.cshtml 文件,查看其中的 Layout 屬性,如下代碼:

@{
    Layout = "_Layout";
}

             上面的標記將所有 Razor 頁面的佈局設置為 Pages 文件夾下的 Pages/_Layout.cshtml所定義的佈局。

 修改佈局

          第一步,我們要使用“書籍管理系統”來替換 Pages/_Layout.cshtml 文件中的 <title> 元素中的RazorMvcBooks字元串。如下代碼。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] – 書籍管理系統</title>

       第二步,在 Pages/_Layout.cshtml 文件中的找到以下數據信息:

<a asp-page="/Index" class="navbar-brand">RazorMvcBooks</a>

          將上面的數據信息替換為以下數據信息:

<a asp-page="/Books/Index" class="navbar-brand">書籍管理系統</a>

        上面的<a>元素是一個標記輔助助手。此處它是<a>標記輔助助手。asp-page="/Books/Index" 標記輔助助手屬性和值可以用來創建指向 /Books/Index  Razor 頁面的鏈接。

           保存所做的修改,在Visual Studio 2017中按F5運行程式,在瀏覽器中通過單擊“書籍管理系統”鏈接測試應用,如下圖。

 


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

-Advertisement-
Play Games
更多相關文章
  • php捷豹路虎 品牌全車零件訂購平臺( php源碼 )php+mysql 架構的平臺型 車零件訂購系統平臺軟體, 已做了數據採集。目前擁有捷豹路虎 幾十G的剖視圖、圖冊、系統(如發動機系統)、零件完整數據。 路虎、捷豹零件數據完整,包括這2款車的 系統圖冊、VIN車輛唯一識別碼查詢及其配件、每個系統 ...
  • 版本:win10系統 virtualbox:5.1.26 vagrant :1.9.7 centos 7.0 xshell/git 首先下載好對應版本的軟體 配置vagrant和virtualbox 一.把虛擬機載入到box容器中 二.找一個/新建一個目錄,例如vagrant,然後初始化環境 初始化 ...
  • Java性能問題一直困擾著廣大程式員,由於平臺複雜性,要定位問題,找出其根源確實很難。隨著10多年Java平臺的改進以及新出現的多核多處理器,Java軟體的性能和擴展性已經今非昔比了。現代JVM持續演進,內建了更為成熟的優化技術、運行時技術和垃圾收集器。與此同時,底層的硬體平臺和操作系統也在演化。 ...
  • 簡介 SourceTree 是一款擁有可視化界面的項目版本控制軟體,適用於git項目管理,同時它集成了 git flow 工作流程,對於不熟悉 git 命令的初學者來說,可以通過 SourceTree 快速學會使用 Git 和 git flow 來參與代碼版本管理和團隊協作開發。 問題 今日在全新的 ...
  • 最近由於工作需要,開始寫托管C++,由於C++11中的mutex,和future等類,托管C++不讓調用(報錯),所以自己實現了托管C++的線程鎖。 該類可確保當一個線程位於代碼的臨界區時,另一個線程不會進入該臨界區。 如果其他線程嘗試進入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。 ...
  • 概述 UWP Community Toolkit 中有一個自適應的 GridView 控制項 - AdaptiveGridView,本篇我們結合代碼詳細講解 AdaptiveGridView 的實現。 AdaptiveGridView 控制項能夠以均勻分組的方式,讓一組列填充整個顯示空間,它可以對佈局和 ...
  • 大家好!我叫藍顏,我是一名大專生。這是我第一次接觸博客園,以後也會一直在。 在學校期間,參加技能大賽(物聯網),接觸到的C#。之後學校教務處要一個調課軟體, 於是我就小試牛刀試了試。當然了,這也是我第一次寫,途中遇到很多問題。竟然是調課 系統肯定會用到word,因為老師的課表都是用word成列出來的 ...
  • 在序言中,我們提到函數式編程的兩大特征:無副作用、函數是第一公民。現在,我們先來深入第一個特征:無副作用。 無副作用是通過引用透明(Referential transparency)來定義的。如果一個表達式滿足將它替換成它的值,而程式的行為不變,則稱這個表達式是引用透明的。 現在,我們不妨進行一個嘗 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...