国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【ASP.NET Core 基礎(chǔ)知識】--MVC框架--Models和數(shù)據(jù)綁定

這篇具有很好參考價值的文章主要介紹了【ASP.NET Core 基礎(chǔ)知識】--MVC框架--Models和數(shù)據(jù)綁定。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

Models和數(shù)據(jù)綁定在ASP.NET Core MVC中扮演著關(guān)鍵的角色,對于構(gòu)建強(qiáng)大、靈活和可維護(hù)的Web應(yīng)用程序至關(guān)重要。這一節(jié)我們就來講一下。

一、Models

1.1 Models的定義和作用

在ASP.NET Core MVC中,Model是應(yīng)用程序中用于表示數(shù)據(jù)結(jié)構(gòu)和業(yè)務(wù)邏輯的一種抽象。Models充當(dāng)了MVC(Model-View-Controller)模式中的“M”(Model)部分,負(fù)責(zé)管理應(yīng)用程序的數(shù)據(jù)、狀態(tài)和業(yè)務(wù)規(guī)則。以下是Models的定義和作用:

  1. 定義:
    • 數(shù)據(jù)結(jié)構(gòu): Models定義了應(yīng)用程序中的數(shù)據(jù)結(jié)構(gòu),包括實(shí)體、對象和數(shù)據(jù)字段。
    • 業(yè)務(wù)邏輯: Models包含與數(shù)據(jù)相關(guān)的業(yè)務(wù)規(guī)則,例如驗(yàn)證規(guī)則、計(jì)算邏輯和數(shù)據(jù)轉(zhuǎn)換。
  2. 作用:
    • 數(shù)據(jù)表示: Models是數(shù)據(jù)在應(yīng)用程序中的邏輯表示。它們定義了數(shù)據(jù)的組織方式,使其更易于理解和處理。
    • 業(yè)務(wù)規(guī)則: Models中包含的業(yè)務(wù)邏輯規(guī)則確保數(shù)據(jù)的有效性、完整性和一致性。
    • 狀態(tài)管理: Models可以跟蹤應(yīng)用程序中的狀態(tài)變化,使得能夠更好地管理數(shù)據(jù)的生命周期。
    • 數(shù)據(jù)驗(yàn)證: Models中定義的驗(yàn)證規(guī)則用于驗(yàn)證用戶輸入,確保輸入的數(shù)據(jù)符合應(yīng)用程序的期望。
    • 模型綁定: Models通過模型綁定將用戶提交的數(shù)據(jù)映射到控制器中,實(shí)現(xiàn)了用戶請求和應(yīng)用程序數(shù)據(jù)的解耦。

通過定義和使用Models,開發(fā)人員能夠更清晰地組織和管理應(yīng)用程序的數(shù)據(jù),提高代碼的可維護(hù)性和可測試性。 Models的作用不僅僅是存儲數(shù)據(jù),還包括在應(yīng)用程序中對數(shù)據(jù)進(jìn)行操作和管理的一系列任務(wù)。

1.2 創(chuàng)建Models類

在ASP.NET Core MVC中創(chuàng)建Models類通常是通過定義C#類來表示應(yīng)用程序中的數(shù)據(jù)結(jié)構(gòu)。下面是一個簡單的示例,展示如何創(chuàng)建一個名為 Product 的Models類:

using System.ComponentModel.DataAnnotations;

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }

    public string Description { get; set; }
}

在這個示例中,Product 類有四個屬性:IdName、PriceDescription。這個 Product 類可以被用作控制器的參數(shù),也可以在視圖中通過模型綁定進(jìn)行處理。在ASP.NET Core MVC中,Models類是連接控制器(Controller)和視圖(View)之間的橋梁,使得數(shù)據(jù)的傳遞更為靈活和高效。

1.3 數(shù)據(jù)驗(yàn)證和注解

在ASP.NET Core MVC中,數(shù)據(jù)驗(yàn)證是通過注解(Attributes)來實(shí)現(xiàn)的,這些注解用于在Models類上標(biāo)記屬性,定義數(shù)據(jù)驗(yàn)證規(guī)則。以下是一些常用的數(shù)據(jù)驗(yàn)證注解:

  1. [Required]
    • 用于標(biāo)記一個屬性為必填項(xiàng),不能為null。如果未提供值,會產(chǎn)生驗(yàn)證錯誤。
    [Required(ErrorMessage = "Name is required")]
    public string Name { get; set; }
    
  2. [StringLength]
    • 用于指定字符串屬性的長度范圍。
    [StringLength(100, MinimumLength = 2, ErrorMessage = "Name length must be between 2 and 100")]
    public string Name { get; set; }
    
  3. [Range]
    • 用于指定數(shù)字屬性的范圍。
    [Range(1, 100, ErrorMessage = "Price must be between 1 and 100")]
    public int Price { get; set; }
    
  4. [RegularExpression]
    • 用于指定字符串屬性的正則表達(dá)式驗(yàn)證。
    [RegularExpression(@"^[a-zA-Z0-9]+$", ErrorMessage = "Invalid characters in the code")]
    public string ProductCode { get; set; }
    
  5. [Compare]
    • 用于比較兩個屬性的值,通常用于確認(rèn)密碼等場景。
    [Compare("Password", ErrorMessage = "Password and Confirm Password must match")]
    public string ConfirmPassword { get; set; }
    
  6. [EmailAddress]
    • 用于驗(yàn)證電子郵件地址的格式。
    [EmailAddress(ErrorMessage = "Invalid email address")]
    public string Email { get; set; }
    
  7. [DataType]
    • 用于指定屬性的數(shù)據(jù)類型。
    [DataType(DataType.Date, ErrorMessage = "Invalid date format")]
    public DateTime BirthDate { get; set; }
    
  8. [CustomValidation]
    • 用于自定義驗(yàn)證邏輯,需要指定驗(yàn)證方法的名稱。
    [CustomValidation(typeof(CustomValidator), "ValidateProductName")]
    public string ProductName { get; set; }
    

這些數(shù)據(jù)驗(yàn)證注解通過在Models類的屬性上使用,提供了一種聲明性的方式來定義數(shù)據(jù)驗(yàn)證規(guī)則。在運(yùn)行時,ASP.NET Core MVC框架會根據(jù)這些注解來執(zhí)行相應(yīng)的驗(yàn)證,并將驗(yàn)證結(jié)果反饋給開發(fā)人員或用戶。這有助于確保應(yīng)用程序接收到有效和符合要求的數(shù)據(jù)。

二、數(shù)據(jù)綁定基礎(chǔ)

2.1 數(shù)據(jù)綁定概述

數(shù)據(jù)綁定是將用戶界面(View)上的控件和數(shù)據(jù)模型(Model)之間建立關(guān)聯(lián)的過程。在ASP.NET Core MVC中,數(shù)據(jù)綁定允許開發(fā)人員以一種簡單而靈活的方式將HTTP請求中的數(shù)據(jù)映射到應(yīng)用程序的模型對象中,同時也可以將模型對象中的數(shù)據(jù)傳遞給用戶界面。
以下是數(shù)據(jù)綁定的概述:

  1. 輸入數(shù)據(jù)綁定:
    • 輸入數(shù)據(jù)綁定是將用戶提交的數(shù)據(jù)映射到控制器的動作方法參數(shù)或模型中的過程。
    • ASP.NET Core MVC框架通過模型綁定器(Model Binder)來執(zhí)行輸入數(shù)據(jù)綁定的任務(wù)。
    • 控制器的動作方法可以直接接收參數(shù),或者通過在方法參數(shù)上使用 [FromBody]、[FromQuery]等特性來指定數(shù)據(jù)來源。
  2. 模型綁定:
    • 模型綁定是將模型對象與HTTP請求中的數(shù)據(jù)進(jìn)行關(guān)聯(lián)的過程。
    • 在控制器的動作方法中,可以通過參數(shù)接收模型對象,并通過模型綁定器將請求數(shù)據(jù)映射到該模型對象中。
    • 模型綁定器會自動嘗試將請求數(shù)據(jù)與模型對象的屬性進(jìn)行匹配。
  3. 輸出數(shù)據(jù)綁定:
    • 輸出數(shù)據(jù)綁定是將模型對象中的數(shù)據(jù)傳遞到用戶界面的過程。
    • 在視圖(View)中,可以通過@model指令聲明綁定到視圖的模型類型。
    • Razor視圖引擎通過模型對象的屬性進(jìn)行輸出數(shù)據(jù)綁定,將模型中的數(shù)據(jù)渲染到HTML中。
  4. 顯式數(shù)據(jù)綁定:
    • 在某些情況下,開發(fā)人員可能需要顯式地執(zhí)行數(shù)據(jù)綁定操作,而不依賴于框架的自動綁定。
    • 這可以通過在控制器中手動調(diào)用 TryUpdateModelUpdateModel 方法來實(shí)現(xiàn)。
  5. 自定義模型綁定:
    • ASP.NET Core MVC允許開發(fā)人員創(chuàng)建自定義的模型綁定器,以滿足特定的業(yè)務(wù)需求。
    • 通過實(shí)現(xiàn) IModelBinder 接口,可以創(chuàng)建自定義的綁定器,并在應(yīng)用程序配置中注冊它們。
  6. 復(fù)雜對象綁定:
    • 數(shù)據(jù)綁定支持復(fù)雜對象,包括嵌套對象、集合和數(shù)組。
    • 框架會嘗試遞歸地將請求數(shù)據(jù)映射到復(fù)雜對象的所有層次。

數(shù)據(jù)綁定是ASP.NET Core MVC中重要的機(jī)制之一,它簡化了處理用戶輸入和管理模型數(shù)據(jù)的過程,同時提供了靈活性和可擴(kuò)展性,使開發(fā)人員能夠更容易地構(gòu)建出強(qiáng)大而高效的Web應(yīng)用程序。

2.2 基本數(shù)據(jù)綁定

在ASP.NET Core MVC中,基本數(shù)據(jù)綁定涉及將用戶提交的數(shù)據(jù)映射到控制器的動作方法參數(shù)或直接映射到模型中。以下是一些基本數(shù)據(jù)綁定的示例:

  1. 從查詢字符串獲取數(shù)據(jù)(Query String):
    public IActionResult Index([FromQuery] string searchTerm)
    {
        // 通過查詢字符串獲取數(shù)據(jù)
        // ...
        return View();
    }
    
    在這個例子中,searchTerm 參數(shù)使用 [FromQuery] 特性,表示它的值將從查詢字符串中獲取。
  2. 從表單提交獲取數(shù)據(jù)(Form Post):
    [HttpPost]
    public IActionResult ProcessForm([FromBody] FormData formData)
    {
        // 通過表單提交獲取數(shù)據(jù)
        // ...
        return View();
    }
    
    在這個例子中,ProcessForm 動作方法使用 [FromBody] 特性,表示它從請求的正文中獲取數(shù)據(jù),通常用于處理以 JSON 格式提交的數(shù)據(jù)。
  3. 直接從路由獲取數(shù)據(jù):
    public IActionResult Details([FromRoute] int id)
    {
        // 直接從路由獲取數(shù)據(jù)
        // ...
        return View();
    }
    
    在這個例子中,id 參數(shù)使用 [FromRoute] 特性,表示它的值將從路由中獲取。
  4. 從請求頭獲取數(shù)據(jù):
    public IActionResult ProcessHeaders([FromHeader] string acceptLanguage)
    {
        // 從請求頭獲取數(shù)據(jù)
        // ...
        return View();
    }
    
    在這個例子中,acceptLanguage 參數(shù)使用 [FromHeader] 特性,表示它的值將從請求頭中獲取。
  5. 從請求獲取全部數(shù)據(jù):
    public IActionResult ProcessRequest([FromForm] FormData formData, [FromQuery] string searchTerm)
    {
        // 通過表單和查詢字符串獲取數(shù)據(jù)
        // ...
        return View();
    }
    
    在這個例子中,ProcessRequest 方法同時接收表單數(shù)據(jù)和查詢字符串?dāng)?shù)據(jù)。

這些例子展示了如何在控制器的動作方法中使用數(shù)據(jù)綁定特性,從不同的來源獲取數(shù)據(jù)。ASP.NET Core MVC框架將負(fù)責(zé)在運(yùn)行時將請求中的數(shù)據(jù)映射到指定的參數(shù)或模型對象中,使得開發(fā)人員可以方便地處理用戶的輸入。

2.3 復(fù)雜數(shù)據(jù)綁定

復(fù)雜數(shù)據(jù)綁定涉及將復(fù)雜對象、嵌套對象、集合或數(shù)組等數(shù)據(jù)結(jié)構(gòu)映射到控制器的動作方法參數(shù)或模型中。ASP.NET Core MVC提供了強(qiáng)大的數(shù)據(jù)綁定功能,可以自動解析和映射這些復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。以下是一些示例:

  1. 復(fù)雜對象綁定:
    假設(shè)有一個包含多個屬性的復(fù)雜對象 Person
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Address Address { get; set; }
}

動作方法:

public IActionResult CreatePerson([FromBody] Person person)
{
    // 通過復(fù)雜對象綁定獲取數(shù)據(jù)
    // ...
    return View();
}

在這個例子中,Person 對象包含了 Address 對象作為其屬性,ASP.NET Core MVC框架會遞歸地執(zhí)行數(shù)據(jù)綁定,將請求的數(shù)據(jù)映射到 Person 對象中。
2. 集合綁定:
假設(shè)有一個包含多個元素的集合:

public class Order
{
    public int OrderId { get; set; }
    public List<string> Items { get; set; }
}

動作方法:

public IActionResult ProcessOrder([FromBody] Order order)
{
    // 通過集合綁定獲取數(shù)據(jù)
    // ...
    return View();
}

在這個例子中,Items 屬性是一個字符串列表,ASP.NET Core MVC框架將嘗試將請求中的數(shù)據(jù)映射到該列表中。
3. 數(shù)組綁定:
與集合綁定類似,但是對于數(shù)組類型的屬性,也可以進(jìn)行綁定:

public class ShoppingCart
{
    public int CartId { get; set; }
    public string[] Products { get; set; }
}

動作方法:

public IActionResult UpdateCart([FromBody] ShoppingCart cart)
{
    // 通過數(shù)組綁定獲取數(shù)據(jù)
    // ...
    return View();
}
  1. 嵌套對象綁定:
    在復(fù)雜對象中嵌套其他對象也是常見的場景,數(shù)據(jù)綁定會自動處理這種情況:
public class Book
{
    public string Title { get; set; }
    public Author Author { get; set; }
}

public class Author
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

動作方法:

public IActionResult AddBook([FromBody] Book book)
{
    // 通過嵌套對象綁定獲取數(shù)據(jù)
    // ...
    return View();
}

這些例子展示了如何處理在ASP.NET Core MVC中進(jìn)行復(fù)雜數(shù)據(jù)綁定,包括嵌套對象、集合和數(shù)組等不同類型的數(shù)據(jù)結(jié)構(gòu)??蚣茉趫?zhí)行數(shù)據(jù)綁定時會自動識別和映射這些復(fù)雜的數(shù)據(jù)結(jié)構(gòu),使得開發(fā)人員能夠更方便地處理和管理應(yīng)用程序的數(shù)據(jù)。

2.4 視圖中的模型綁定

在ASP.NET Core MVC中,視圖中的模型綁定是指將控制器傳遞給視圖的模型數(shù)據(jù)與視圖中的元素進(jìn)行關(guān)聯(lián)的過程。通過模型綁定,視圖能夠輕松地顯示控制器傳遞的模型數(shù)據(jù),而無需手動處理每個數(shù)據(jù)項(xiàng)。以下是一些視圖中的模型綁定的基本概念和示例:

  1. 聲明視圖模型類型:
    在視圖中,通過使用 @model 指令聲明視圖將要綁定的模型類型。這通常在視圖的開頭部分完成,指定視圖的模型類型,例如:
@model YourNamespace.YourModelType
  1. 模型數(shù)據(jù)綁定:
    一旦聲明了模型類型,視圖可以通過 Model 屬性來訪問模型中的數(shù)據(jù),并將數(shù)據(jù)綁定到HTML元素。以下是一些示例:
<!-- 顯示模型屬性 -->
<h1>@Model.Title</h1>

<!-- 使用模型中的集合 -->
<ul>
    @foreach (var item in Model.Items)
    {
        <li>@item</li>
    }
</ul>

<!-- 使用模型中的嵌套對象 -->
<p>Author: @Model.Author.FirstName @Model.Author.LastName</p>
  1. 表單綁定:
    在表單中,可以使用 HtmlHelper 的一些輔助方法來實(shí)現(xiàn)表單元素與模型屬性的雙向綁定。例如,使用 Html.EditorForHtml.TextBoxFor
@model YourNamespace.Person

<form asp-action="CreatePerson" method="post">
    <label asp-for="FirstName">First Name:</label>
    <input asp-for="FirstName" />

    <label asp-for="LastName">Last Name:</label>
    <input asp-for="LastName" />

    <button type="submit">Create Person</button>
</form>

在這個例子中,asp-for 屬性用于建立視圖中的元素與模型屬性之間的關(guān)聯(lián)。這樣,當(dāng)用戶提交表單時,框架會自動將表單數(shù)據(jù)綁定到模型對象中。
4. 選擇列表綁定:
使用 Html.DropDownListFor 輔助方法實(shí)現(xiàn)選擇列表與模型屬性的綁定:

@model YourNamespace.Student

<form asp-action="Enroll" method="post">
    <label asp-for="StudentId">Student:</label>
    <select asp-for="StudentId" asp-items="ViewBag.StudentList">
        <option>Please select</option>
    </select>

    <button type="submit">Enroll Student</button>
</form>

在這個例子中,asp-items 屬性指定了選擇列表的數(shù)據(jù)源,而 asp-for 屬性將選擇列表的值與模型屬性進(jìn)行關(guān)聯(lián)。

通過這些模型綁定技術(shù),視圖能夠輕松地與控制器中傳遞的模型數(shù)據(jù)進(jìn)行交互,使開發(fā)人員能夠更方便地呈現(xiàn)和處理用戶界面。

三、輸入驗(yàn)證

3.1 數(shù)據(jù)驗(yàn)證的重要性

數(shù)據(jù)驗(yàn)證在軟件開發(fā)中非常重要,尤其在Web應(yīng)用程序中更是至關(guān)重要。以下是數(shù)據(jù)驗(yàn)證的一些重要性:

  1. 確保數(shù)據(jù)的有效性:
    • 數(shù)據(jù)驗(yàn)證有助于確保應(yīng)用程序接收到的數(shù)據(jù)是有效和合法的。有效的數(shù)據(jù)符合應(yīng)用程序的預(yù)期格式、范圍和規(guī)則。
  2. 防止惡意攻擊:
    • 數(shù)據(jù)驗(yàn)證可以有效地防止惡意用戶提交惡意數(shù)據(jù),例如SQL注入、跨站腳本(XSS)攻擊等。通過驗(yàn)證輸入數(shù)據(jù),可以減輕安全風(fēng)險。
  3. 提高數(shù)據(jù)完整性:
    • 數(shù)據(jù)驗(yàn)證確保數(shù)據(jù)的完整性,防止無效或缺失的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫。這有助于保持?jǐn)?shù)據(jù)的一致性,提高數(shù)據(jù)質(zhì)量。
  4. 減少錯誤和異常:
    • 通過在用戶輸入之前進(jìn)行數(shù)據(jù)驗(yàn)證,可以減少由于錯誤輸入而引起的異常。這有助于提高應(yīng)用程序的穩(wěn)定性和可靠性。
  5. 改善用戶體驗(yàn):
    • 合適的數(shù)據(jù)驗(yàn)證提高了用戶界面的友好性。通過在前端進(jìn)行驗(yàn)證,用戶能夠更早地得知輸入錯誤,而不是等到提交表單后才得知。
  6. 降低后期成本:
    • 在開發(fā)階段實(shí)施強(qiáng)大的數(shù)據(jù)驗(yàn)證可以降低維護(hù)和修復(fù)錯誤的成本。在開發(fā)過程中,及時解決和規(guī)避數(shù)據(jù)驗(yàn)證問題可以減少在生產(chǎn)環(huán)境中發(fā)生的錯誤。
  7. 支持業(yè)務(wù)規(guī)則和邏輯:
    • 數(shù)據(jù)驗(yàn)證是實(shí)施業(yè)務(wù)規(guī)則和邏輯的關(guān)鍵步驟。通過驗(yàn)證數(shù)據(jù),確保數(shù)據(jù)符合業(yè)務(wù)規(guī)則,有助于保持業(yè)務(wù)邏輯的一致性。
  8. 遵循法規(guī)和標(biāo)準(zhǔn):
    • 數(shù)據(jù)驗(yàn)證是遵循法規(guī)和行業(yè)標(biāo)準(zhǔn)的一部分。特定行業(yè)可能有數(shù)據(jù)保護(hù)和隱私方面的法規(guī)要求,數(shù)據(jù)驗(yàn)證有助于滿足這些法規(guī)。

數(shù)據(jù)驗(yàn)證是構(gòu)建健壯、安全和高質(zhì)量應(yīng)用程序的關(guān)鍵組成部分。通過在應(yīng)用程序的各個層次進(jìn)行細(xì)致的數(shù)據(jù)驗(yàn)證,可以提高系統(tǒng)的可維護(hù)性和穩(wěn)定性,同時保護(hù)用戶數(shù)據(jù)的安全性。

3.2 服務(wù)器端驗(yàn)證

服務(wù)器端驗(yàn)證是在Web應(yīng)用程序的服務(wù)器端執(zhí)行的一種數(shù)據(jù)驗(yàn)證形式。它是確保用戶提交的數(shù)據(jù)符合應(yīng)用程序要求和安全標(biāo)準(zhǔn)的重要手段。與客戶端驗(yàn)證相比,服務(wù)器端驗(yàn)證更為可靠,因?yàn)榭蛻舳蓑?yàn)證可以被繞過,而服務(wù)器端驗(yàn)證是在實(shí)際的服務(wù)器上執(zhí)行的。以下是關(guān)于服務(wù)器端驗(yàn)證的一些關(guān)鍵方面:

  1. 驗(yàn)證框架和庫:
    • ASP.NET Core提供了一系列內(nèi)置的驗(yàn)證框架和庫,如 System.ComponentModel.DataAnnotations 命名空間,用于在服務(wù)器端執(zhí)行驗(yàn)證。這包括一系列的驗(yàn)證特性,例如 [Required][StringLength]、[Range] 等,用于標(biāo)記在模型類中的屬性上。
  2. 自定義驗(yàn)證規(guī)則:
    • 除了內(nèi)置的驗(yàn)證特性外,開發(fā)人員還可以創(chuàng)建自定義的驗(yàn)證規(guī)則,以適應(yīng)應(yīng)用程序特定的驗(yàn)證需求。這通常涉及創(chuàng)建自定義驗(yàn)證特性或在服務(wù)器端驗(yàn)證邏輯中進(jìn)行手動驗(yàn)證。
    public class CustomValidationAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            // 自定義驗(yàn)證邏輯
            // ...
    
            return ValidationResult.Success; // 或者返回 ValidationResult.Error
        }
    }
    
  3. 在控制器中執(zhí)行驗(yàn)證:
    • 在ASP.NET Core MVC中,服務(wù)器端驗(yàn)證通常在控制器的動作方法中執(zhí)行。使用 ModelState 對象可以獲取和處理驗(yàn)證結(jié)果,以便根據(jù)驗(yàn)證狀態(tài)采取相應(yīng)的行動。
    [HttpPost]
    public IActionResult Create([FromBody] YourModel model)
    {
        if (ModelState.IsValid)
        {
            // 處理有效的數(shù)據(jù)
            // ...
            return RedirectToAction("Success");
        }
        else
        {
            // 處理驗(yàn)證失敗的情況
            // ...
            return View(model);
        }
    }
    
  4. 返回驗(yàn)證錯誤信息:
    • 在服務(wù)器端驗(yàn)證失敗時,通常需要將相應(yīng)的錯誤信息返回給用戶。這可以通過在 ModelState 對象中添加錯誤消息來實(shí)現(xiàn)。
    ModelState.AddModelError("PropertyName", "Error Message");
    
    然后,這些錯誤信息可以在視圖中用于顯示錯誤消息,以幫助用戶正確填寫表單或提交數(shù)據(jù)。

服務(wù)器端驗(yàn)證是保護(hù)應(yīng)用程序免受無效數(shù)據(jù)影響的重要手段,尤其是在涉及敏感信息和關(guān)鍵業(yè)務(wù)邏輯的場景下。它是構(gòu)建安全、穩(wěn)定和符合規(guī)范的Web應(yīng)用程序的關(guān)鍵組成部分。

3.3 客戶端驗(yàn)證

客戶端驗(yàn)證是在用戶的瀏覽器上執(zhí)行的一種數(shù)據(jù)驗(yàn)證形式,用于提供更即時的反饋和改進(jìn)用戶體驗(yàn)。雖然客戶端驗(yàn)證是有益的,但由于安全性考慮,它不能替代服務(wù)器端驗(yàn)證。以下是客戶端驗(yàn)證的一些關(guān)鍵方面:

  1. 前端驗(yàn)證框架和庫:
    • 常見的前端驗(yàn)證框架和庫如 jQuery Validation、Validator.js、或是在框架中內(nèi)建的驗(yàn)證機(jī)制(如在React中使用的Formik或在Angular中使用的Reactive Forms)等,它們提供了一系列驗(yàn)證規(guī)則、方法和事件,使得在客戶端對用戶輸入進(jìn)行驗(yàn)證更加方便。
  2. HTML5表單驗(yàn)證:
    • HTML5引入了一些新的表單元素和屬性,可以用于在客戶端執(zhí)行一些基本的驗(yàn)證,如 requiredpattern、min、max 等。這使得可以在不使用JavaScript的情況下進(jìn)行一些簡單的客戶端驗(yàn)證。
    <input type="text" name="username" required pattern="[a-zA-Z0-9]+" />
    
  3. JavaScript驗(yàn)證:
    • 使用JavaScript編寫客戶端驗(yàn)證邏輯是一種常見的方式。通過在頁面上嵌入JavaScript代碼或通過外部腳本文件,可以在用戶輸入數(shù)據(jù)之前對其進(jìn)行驗(yàn)證。
    <script>
        function validateForm() {
            var username = document.getElementById("username").value;
            if (username.length < 3) {
                alert("Username must be at least 3 characters long");
                return false;
            }
            return true;
        }
    </script>
    
    <form onsubmit="return validateForm()">
        <!-- form elements -->
    </form>
    
  4. Ajax驗(yàn)證:
    • 使用Ajax技術(shù),可以在不刷新整個頁面的情況下向服務(wù)器發(fā)送驗(yàn)證請求。這使得可以在用戶填寫表單的同時異步地驗(yàn)證輸入數(shù)據(jù)。
  5. 即時反饋:
    • 客戶端驗(yàn)證允許即時反饋,使用戶在提交表單之前就能看到可能的錯誤信息。這有助于提高用戶體驗(yàn)和減少用戶填寫無效數(shù)據(jù)的可能性。

客戶端驗(yàn)證有助于提高用戶體驗(yàn),減輕服務(wù)器負(fù)擔(dān),并在用戶輸入之前快速捕獲錯誤。然而,需要注意客戶端驗(yàn)證不能替代服務(wù)器端驗(yàn)證,因?yàn)榭蛻舳蓑?yàn)證可能被繞過或禁用,而服務(wù)器端驗(yàn)證是安全的最后一道防線,確保無論什么情況下都對數(shù)據(jù)進(jìn)行正確驗(yàn)證。因此,綜合使用客戶端驗(yàn)證和服務(wù)器端驗(yàn)證是構(gòu)建安全、穩(wěn)定和用戶友好的Web應(yīng)用程序的最佳實(shí)踐。

四、自定義綁定

4.1 自定義模型綁定器

在ASP.NET Core MVC中,可以通過自定義模型綁定器來實(shí)現(xiàn)特定類型的自定義綁定邏輯。模型綁定器負(fù)責(zé)將HTTP請求中的數(shù)據(jù)映射到控制器的參數(shù)或模型對象上。通過自定義模型綁定器,你可以適應(yīng)應(yīng)用程序特定的需求或處理特殊類型的綁定操作。以下是創(chuàng)建自定義模型綁定器的一般步驟:

  1. 實(shí)現(xiàn) IModelBinder 接口:
    • 創(chuàng)建一個類,并實(shí)現(xiàn) IModelBinder 接口。這個接口包含一個方法 BindModelAsync,該方法用于執(zhí)行綁定操作。
    public class CustomModelBinder : IModelBinder
    {
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            // 在這里實(shí)現(xiàn)自定義的綁定邏輯
            // ...
    
            return Task.CompletedTask;
        }
    }
    
  2. 注冊自定義綁定器:
    • 在應(yīng)用程序的啟動配置中,通過 ModelBinderAttributeModelBinderProvider 注冊自定義模型綁定器。
    [ModelBinder(BinderType = typeof(CustomModelBinder))]
    public class CustomModel
    {
        // 模型的屬性
    }
    
    或者使用 ModelBinderProvider
    public class CustomModelBinderProvider : IModelBinderProvider
    {
        public IModelBinder GetBinder(ModelBinderProviderContext context)
        {
            if (context.Metadata.ModelType == typeof(CustomModel))
            {
                return new CustomModelBinder();
            }
    
            return null;
        }
    }
    
  3. 配置應(yīng)用程序使用自定義綁定器:
    • Startup.cs 文件的 ConfigureServices 方法中配置應(yīng)用程序使用自定義模型綁定器。
    public void ConfigureServices(IServiceCollection services)
    {
        // 添加自定義模型綁定器提供程序
        services.AddMvc(options =>
        {
            options.ModelBinderProviders.Insert(0, new CustomModelBinderProvider());
        });
    }
    
  4. 在控制器中使用自定義綁定器:
    • 在控制器的動作方法中使用自定義模型類型,并確保模型綁定器被應(yīng)用。
    public IActionResult MyAction([ModelBinder(BinderType = typeof(CustomModelBinder))] CustomModel model)
    {
        // 在這里使用綁定后的模型
        // ...
        return View();
    }
    

通過自定義模型綁定器,你可以實(shí)現(xiàn)對特定類型的高度定制的綁定邏輯,從而更靈活地處理數(shù)據(jù)綁定的場景。這在處理非標(biāo)準(zhǔn)數(shù)據(jù)類型、解析復(fù)雜格式或執(zhí)行額外的驗(yàn)證邏輯時非常有用。

4.2 自定義模型驗(yàn)證器

在ASP.NET Core MVC中,你可以通過自定義模型驗(yàn)證器來實(shí)現(xiàn)對模型中數(shù)據(jù)的自定義驗(yàn)證邏輯。模型驗(yàn)證器通常是在模型的屬性上應(yīng)用的驗(yàn)證特性,但有時你可能需要執(zhí)行更復(fù)雜的驗(yàn)證,例如涉及多個屬性的驗(yàn)證邏輯或依賴外部服務(wù)的驗(yàn)證。以下是創(chuàng)建自定義模型驗(yàn)證器的一般步驟:

  1. 創(chuàng)建自定義驗(yàn)證器類:
    • 創(chuàng)建一個自定義的驗(yàn)證器類,通常繼承自 ValidationAttribute 類。
    public class CustomValidationAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            // 在這里實(shí)現(xiàn)自定義的驗(yàn)證邏輯
            // ...
    
            return ValidationResult.Success; // 或者返回 ValidationResult.Error
        }
    }
    
  2. 在模型中使用自定義驗(yàn)證器:
    • 在模型的屬性上應(yīng)用自定義驗(yàn)證器。
    public class CustomModel
    {
        [CustomValidation]
        public string CustomProperty { get; set; }
    }
    
  3. 處理復(fù)雜的驗(yàn)證邏輯:
    • IsValid 方法中,你可以訪問當(dāng)前驗(yàn)證的屬性值以及整個模型的其他屬性值。這使得可以實(shí)施更復(fù)雜的驗(yàn)證邏輯。
    public class CustomValidationAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            // 訪問當(dāng)前驗(yàn)證的屬性值
            var currentValue = value;
    
            // 訪問整個模型的其他屬性值
            var model = (CustomModel)validationContext.ObjectInstance;
            var otherPropertyValue = model.OtherProperty;
    
            // 實(shí)施復(fù)雜的驗(yàn)證邏輯
            // ...
    
            return ValidationResult.Success; // 或者返回 ValidationResult.Error
        }
    }
    
  4. 在視圖中顯示錯誤消息:
    • 在視圖中使用 ValidationMessageFor 輔助方法或手動檢查 ModelState 來顯示驗(yàn)證錯誤消息。
    <div>
        @Html.LabelFor(model => model.CustomProperty)
        @Html.TextBoxFor(model => model.CustomProperty)
        @Html.ValidationMessageFor(model => model.CustomProperty)
    </div>
    

通過自定義模型驗(yàn)證器,你可以實(shí)現(xiàn)對模型中數(shù)據(jù)的高度定制的驗(yàn)證邏輯,從而滿足特定的業(yè)務(wù)需求。這使得你能夠更靈活地處理復(fù)雜的驗(yàn)證場景,確保應(yīng)用程序接收到的數(shù)據(jù)符合業(yè)務(wù)規(guī)則和安全標(biāo)準(zhǔn)。

五、實(shí)例演練

假設(shè)有一個簡單的模型類 Person

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

然后,在控制器中創(chuàng)建一個動作方法來處理表單提交:

public class DemoController : Controller
{
    [HttpGet]
    public IActionResult Index()
    {
        // 返回一個空的表單頁面
        return View();
    }

    [HttpPost]
    public IActionResult Index(Person person)
    {
        // 處理表單提交,person 對象將通過模型綁定器自動填充
        if (ModelState.IsValid)
        {
            // 執(zhí)行成功的邏輯
            return RedirectToAction("Success");
        }
        else
        {
            // 表單驗(yàn)證失敗,返回原始頁面并顯示錯誤消息
            return View(person);
        }
    }

    public IActionResult Success()
    {
        // 成功頁面
        return View();
    }
}

接下來,創(chuàng)建對應(yīng)的視圖文件。在 Views/Demo 目錄下創(chuàng)建 Index.cshtmlSuccess.cshtml 文件:
Index.cshtml:

@model Person

<h2>Submit Form</h2>

@using (Html.BeginForm("Index", "Demo", FormMethod.Post))
{
    <div>
        <label asp-for="FirstName">First Name:</label>
        <input asp-for="FirstName" />
        <span asp-validation-for="FirstName"></span>
    </div>

    <div>
        <label asp-for="LastName">Last Name:</label>
        <input asp-for="LastName" />
        <span asp-validation-for="LastName"></span>
    </div>

    <div>
        <label asp-for="Age">Age:</label>
        <input asp-for="Age" />
        <span asp-validation-for="Age"></span>
    </div>

    <button type="submit">Submit</button>
}

Success.cshtml:

<h2>Form Submitted Successfully!</h2>
<p>Thank you for submitting the form.</p>

在這個例子中:

  1. Index 動作方法包含兩個版本,一個處理 GET 請求,返回一個用于提交表單的頁面;另一個處理 POST 請求,接收表單數(shù)據(jù)并執(zhí)行相應(yīng)的邏輯。
  2. Person 類是模型,其屬性 FirstNameLastNameAge 與表單中的輸入字段相匹配。
  3. 表單中使用 asp-forasp-validation-for 輔助方法來生成輸入字段和驗(yàn)證錯誤消息。這將與模型綁定器協(xié)同工作,確保表單數(shù)據(jù)正確地綁定到 Person 對象。
  4. Index 的 POST 版本中,使用 ModelState.IsValid 來檢查模型的驗(yàn)證狀態(tài)。如果驗(yàn)證失敗,會將用戶重定向回原始表單頁面,并顯示相應(yīng)的錯誤消息;如果驗(yàn)證成功,用戶將被重定向到 Success 頁面。

這個簡單的例子涵蓋了基本的模型和綁定概念,以及如何在控制器和視圖中使用它們。在實(shí)際應(yīng)用程序中,可以根據(jù)業(yè)務(wù)需求擴(kuò)展這些概念,并使用更復(fù)雜的模型、驗(yàn)證器和綁定器。

六、最佳實(shí)踐和注意事項(xiàng)

ASP.NET Core MVC是一個靈活、強(qiáng)大的框架,但在開發(fā)過程中,遵循一些佳實(shí)踐和注意事項(xiàng)能夠提高代碼的質(zhì)量、可維護(hù)性和性能。以下是一些ASP.NET Core MVC的佳實(shí)踐和注意事項(xiàng):

  1. 遵循MVC模式:
    • 嚴(yán)格遵循MVC(Model-View-Controller)模式,將業(yè)務(wù)邏輯(模型)、用戶界面(視圖)和請求處理(控制器)分離。這樣可以使代碼更加模塊化、可測試和可維護(hù)。
  2. 使用依賴注入:
    • 使用ASP.NET Core的內(nèi)置依賴注入容器,將服務(wù)注入到控制器、視圖和其他組件中。依賴注入提高了代碼的可測試性和可維護(hù)性,并促使良好的解耦。
  3. 使用特性路由:
    • 使用特性路由(Attribute Routing)來定義路由,而不是傳統(tǒng)的基于約定的路由。特性路由使得路由配置更加直觀、靈活,并且能夠更好地描述控制器和動作的關(guān)系。
  4. 處理異常:
    • 實(shí)現(xiàn)全局異常處理,捕獲未處理的異常,并提供友好的錯誤頁面。這有助于提高應(yīng)用程序的穩(wěn)定性和用戶體驗(yàn)。
  5. 有效使用ViewModels:
    • 使用ViewModels來傳遞數(shù)據(jù)給視圖,而不是直接將實(shí)體模型傳遞給視圖。這有助于防止過多的數(shù)據(jù)暴露給前端,同時也能更好地適應(yīng)視圖的需求。
  6. 安全性和防范攻擊:
    • 始終對用戶輸入進(jìn)行驗(yàn)證和編碼,以防范跨站腳本(XSS)攻擊、SQL注入等安全問題。使用內(nèi)置的特性(例如 [ValidateAntiForgeryToken])來增加安全性。
  7. 啟用HTTPS:
    • 將應(yīng)用程序配置為使用HTTPS,以確保數(shù)據(jù)在傳輸過程中的安全性。這可以通過在 Startup.cs 中啟用HTTPS:
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpsRedirection(options =>
        {
            options.HttpsPort = 443;
        });
    }
    
  8. 緩存和性能優(yōu)化:
    • 使用適當(dāng)?shù)木彺鏅C(jī)制來提高性能。ASP.NET Core提供了緩存中間件,可以用于在應(yīng)用程序中實(shí)現(xiàn)緩存。
  9. 定期更新依賴項(xiàng):
    • 定期更新應(yīng)用程序的NuGet包和依賴項(xiàng),以確保使用最新的穩(wěn)定版本。這有助于修復(fù)潛在的漏洞和保持應(yīng)用程序的健康狀態(tài)。
  10. 單元測試:
    • 編寫并運(yùn)行單元測試來驗(yàn)證控制器、服務(wù)和其他組件的行為。這有助于快速發(fā)現(xiàn)和修復(fù)問題,并確保代碼的可靠性。
  11. 使用Middleware:
    • 使用中間件來處理應(yīng)用程序中的各種功能,如身份驗(yàn)證、授權(quán)、日志記錄等。這有助于將應(yīng)用程序的功能模塊化、可復(fù)用,并提高可維護(hù)性。

這些是一些通用的ASP.NET Core MVC的佳實(shí)踐和注意事項(xiàng)。根據(jù)具體項(xiàng)目的需求和規(guī)模,可能還需要進(jìn)一步考慮其他方面的最佳實(shí)踐,例如分布式緩存、日志記錄策略等。在開發(fā)過程中,保持對官方文檔和社區(qū)最佳實(shí)踐的關(guān)注也是非常重要的。

七、總結(jié)

ASP.NET Core MVC是一個強(qiáng)大而靈活的Web應(yīng)用程序框架,它采用MVC模式,通過模型、視圖和控制器的分離促進(jìn)了代碼的模塊化和可維護(hù)性。在實(shí)踐中,我們學(xué)到了創(chuàng)建模型、數(shù)據(jù)綁定、服務(wù)器端和客戶端驗(yàn)證、自定義模型綁定器和驗(yàn)證器等基礎(chǔ)概念。通過建立良好的MVC結(jié)構(gòu),有效使用依賴注入、特性路由和ViewModels,我們能夠構(gòu)建健壯、安全、可維護(hù)的應(yīng)用程序。同時,采用HTTPS、異常處理、緩存和性能優(yōu)化等實(shí)踐可提高應(yīng)用程序的安全性和性能??傮w而言,ASP.NET Core MVC提供了一系列的最佳實(shí)踐和注意事項(xiàng),以幫助開發(fā)者構(gòu)建現(xiàn)代、可靠的Web應(yīng)用。文章來源地址http://www.zghlxwxcb.cn/news/detail-817764.html

到了這里,關(guān)于【ASP.NET Core 基礎(chǔ)知識】--MVC框架--Models和數(shù)據(jù)綁定的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【ASP.NET Core 基礎(chǔ)知識】--路由和請求處理--路由概念(二)

    一、路由參數(shù)傳遞方式 1.1 查詢字符串參數(shù) 在路由中,查詢字符串參數(shù)是一種常見的方式傳遞信息。這種方式通過URL中的查詢字符串(?key1=value1key2=value2)將參數(shù)附加到請求中。在ASP.NET Core中,可以通過以下方式在控制器動作方法中接收查詢字符串參數(shù): 在上述例子中,查詢

    2024年01月21日
    瀏覽(377)
  • 【一文詳解】知識分享:(ASP.Net Core基礎(chǔ)學(xué)習(xí)及快速入門)

    【一文詳解】知識分享:(ASP.Net Core基礎(chǔ)學(xué)習(xí)及快速入門)

    .Net .NET是微軟的一個開發(fā)平臺,這個平臺的一大特點(diǎn)就是跨語言性,不管是什么語言,c、c++、c#、F#、J#、vb等語言都可以用這個平臺合作開發(fā); .NET,它是微軟創(chuàng)建的一個用于構(gòu)建多種不同類型的應(yīng)用程序的開發(fā)人員平臺。 .NET 是一個廣泛的術(shù)語,用于描述整個 Microsoft 的軟件

    2024年02月01日
    瀏覽(154)
  • 【ASP.NET Core 基礎(chǔ)知識】--依賴注入(DI)--什么是依賴注入

    依賴注入(Dependency Injection,簡稱DI)是一種設(shè)計(jì)模式,用于解耦和管理類之間的依賴關(guān)系。它的核心思想是將原本需要在代碼中顯式創(chuàng)建的依賴關(guān)系,交給外部容器進(jìn)行控制和管理。 具體來說,依賴注入的實(shí)現(xiàn)方式是通過將依賴對象的創(chuàng)建和維護(hù)責(zé)任轉(zhuǎn)移到外部容器中,使

    2024年01月23日
    瀏覽(89)
  • 【ASP.NET Core 基礎(chǔ)知識】--中間件--什么是中間件

    本篇文章作為中間件單元的開篇文章,通過這篇文章可以了解什么是中間件、內(nèi)置中間件的使用以及怎么創(chuàng)建自定義中間件。我們先來看一下中間件的角色、目的和重要性。 1. 角色 請求處理管道的構(gòu)建塊: 中間件是構(gòu)成ASP.NET Core請求處理管道的基本組成部分。每個HTTP請求都

    2024年01月16日
    瀏覽(137)
  • 【ASP.NET Core 基礎(chǔ)知識】--安全性--SSL和HTTPS配置

    一、SSL和HTTPS基礎(chǔ)知識 1.1 SSL(安全套接層)是什么? SSL(安全套接層)是一種加密協(xié)議,用于在網(wǎng)絡(luò)上安全地傳輸數(shù)據(jù)。它最初由Netscape公司在1990年代中期開發(fā),旨在確保在Internet上進(jìn)行的通信的安全性和完整性。SSL通過對數(shù)據(jù)進(jìn)行加密、認(rèn)證和完整性驗(yàn)證來保護(hù)通信過程,

    2024年02月20日
    瀏覽(90)
  • 【ASP.NET Core 基礎(chǔ)知識】--中間件--內(nèi)置中間件的使用

    ASP.NET Core 中包含很多內(nèi)置的中間件,我們不可能對每一個內(nèi)置的中間件進(jìn)行一一講解,并且中間件的使用步驟大致一樣,因此本文講解幾個常用的內(nèi)置中間件以及使用中間件的步驟,希望讀者們可以舉一反三。 一、內(nèi)置中間件的介紹 1.1 靜態(tài)文件中間件 在ASP.NET Core中,靜態(tài)

    2024年01月17日
    瀏覽(97)
  • 【ASP.NET Core 基礎(chǔ)知識】--中間件--創(chuàng)建自定義中間件

    一、為什么需要自定義中間件 自定義中間件在ASP.NET Core中的應(yīng)用主要有以下幾個原因: 滿足特定需求: 默認(rèn)情況下,ASP.NET Core提供了許多內(nèi)置的中間件來處理常見的任務(wù),如身份驗(yàn)證、授權(quán)、靜態(tài)文件服務(wù)等。然而,某些項(xiàng)目可能有特定的需求,需要定制化的處理流程,這

    2024年01月17日
    瀏覽(100)
  • 【ASP.NET Core 基礎(chǔ)知識】--最佳實(shí)踐和進(jìn)階主題--微服務(wù)和容器化

    Tip:想要了解并學(xué)習(xí)微服務(wù)和容器化的知識,請?zhí)D(zhuǎn)到《Docker極簡教程》 一、微服務(wù)概述 1.1 什么是微服務(wù)? 微服務(wù)(Microservices)是一種軟件架構(gòu)風(fēng)格,其中軟件系統(tǒng)被劃分為一組小型、自治的服務(wù)單元,這些服務(wù)單元圍繞著業(yè)務(wù)能力進(jìn)行組織,并通過輕量級的通信機(jī)制相

    2024年02月19日
    瀏覽(87)
  • asp.net core 框架搭建2-搭建MVC后臺管理系統(tǒng)

    asp.net core 框架搭建2-搭建MVC后臺管理系統(tǒng)

    作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/131458964 asp.net core 框架搭建2-搭建MVC后臺管理系統(tǒng) ,本文章介紹asp.net core框架搭建,然后開發(fā)一個后臺管理系統(tǒng),將一步步帶著大家,實(shí)現(xiàn)目標(biāo)。所有操作過程將展現(xiàn)在本篇文章,下面咋們一起來實(shí)現(xiàn)它吧。 使

    2024年02月12日
    瀏覽(20)
  • ASP.NET Core MVC 從入門到精通之鑒權(quán)授權(quán)基礎(chǔ)

    ASP.NET Core MVC 從入門到精通之鑒權(quán)授權(quán)基礎(chǔ)

    隨著技術(shù)的發(fā)展,ASP.NET Core MVC也推出了好長時間,經(jīng)過不斷的版本更新迭代,已經(jīng)越來越完善,本系列文章主要講解ASP.NET Core MVC開發(fā)B/S系統(tǒng)過程中所涉及到的相關(guān)內(nèi)容,適用于初學(xué)者,在校畢業(yè)生,或其他想從事ASP.NET Core MVC 系統(tǒng)開發(fā)的人員。 經(jīng)過前幾篇文章的講解,初步

    2024年02月08日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包