ASP.NET CORE基礎教程
阿新 • • 發佈:2022-01-23
目錄
- 第一課 基本概念
- 第二課 控制器的介紹
- 第三課 檢視與表單
- 第四課 資料驗證
- 第五課 路由規則
- 第六課 應用釋出與部署
- 原始碼地址
第一課 基本概念
- 基本概念
- Asp.Net Core Mvc是.NET Core平臺下的一種Web應用開發框架
- 符合Web應用特點
- .NET Core跨平臺解決方案
- MVC設計模式的一種實現
- Asp.Net Core Mvc是.NET Core平臺下的一種Web應用開發框架
- 環境準備
- 安裝最新版Visual Studio 2017
- 安裝最新版.NET Core Sdk
第二課 控制器的介紹
- 控制器定義方式:
- 命名以Controller結尾
- 使用ControllerAttribute標註
public class TestController : Controller { } [Controller] public class Test : Controller { }
預設路由規則
- 域名/控制器類/方法
- {Domain}/{Controller}/{Action}
資料形式
- QueryString: ?name=zhangsan&age=22
- Form
- Cookie
- Session
- Header
HttpRequest
- HttpRequest 是使用者請求物件
- 提供獲取請求資料的屬性
- Cookies,Headers,Query,QueryString,Form
public IActionResult Hello() { // Query var name = Request.Query["name"]; // QueryString var query = Request.QueryString.Value; // Form var username = Request.Form["username"]; // Cookies var cookie = Request.Cookies["item"]; // Headers var headers = Request.Headers["salt"]; return Content("Hello"); }
- HttpContext
- HttpContext是使用者請求上下文
- 提供Session屬性獲取Session物件
- Session.Set 設定
- Session.Remove 移除
- Session.TryGetValue 獲取資料
public IActionResult Hello() { // byte[] HttpContext.Session.Set("byte",new byte[] { 1,2,3,4,5 }); var bytes = HttpContext.Session.Get("byte"); // string HttpContext.Session.SetString("name","tom"); var name = HttpContext.Session.GetString("name"); // int HttpContext.Session.SetInt32("id",20); var id = HttpContext.Session.GetInt32("id"); HttpContext.Session.Remove("name"); HttpContext.Session.Clear(); return Content("Hello");}
- 資料繫結
- 把使用者請求的資料繫結到控制器方法的引數上
- 支援簡單型別與自定義型別
- 繫結規則是請求資料名稱與引數名稱一致
- 如查詢字串key名稱跟引數一致
- Form表單名稱跟引數一致
public IActionResult Hello(RequestModel request,int? age) { // 查詢字串 var test = Request.Query["test"]; // 簡單型別 var userAge = age; // 自定義型別 var name = request.Name; return Content("Hello"); } public class RequestModel { public string Name { get; set; } }
- 內容補充
- 如果以Controller結尾的都是控制器,那如果程式裡面由一些業務命名的時候也是以Controller結尾,怎麼辦?
- NonControllerAttribute
/// <summary> /// 拍賣師控制類 /// </summary> [NonController] public class AuctionController { }
- 常用特性
特性 | 資料來源 |
---|---|
FromHeaderAttribute | 請求頭資料 |
FromRouteAttribute | 路由資料 |
FromBodyAttribute | 請求體 |
FromFormAttribute | 表單資料 |
FromQueryAttribute | 查詢字串 |
FromServicesAttribute | 服務註冊 |
public IActionResult Say( [FromForm]string name,[FromQuery]int age,[FromHeader] string salt,[FromBody] string content ) { return View(); }
特性引數
- 通過特性修飾引數來影響繫結邏輯
- 靈活擴充套件
IActionResult
- 動作結果介面
- 具體實現
- onResult:返回JSON結構資料
- RedirectResult:跳轉到新地址
- FileResult:返回檔案
- ViewResult:返回檢視內容
- ContentResult:文字內容
第三課 檢視與表單
- 資料傳遞
- ViewData
- ViewBag
- tempData
- Model
- Session
- Cache
ViewData | ViewBag |
---|---|
鍵值對 | 動態型別 |
索引器 | ViewData的封裝 |
支援任意型別 | 動態屬性 |
TempData | Cache | Session |
---|---|---|
檢視級別 | 應用程式級別 | 會話級別 |
只允許消費一次 | 伺服器端儲存 | 伺服器端儲存 |
可多次賦值 | 可設定有效期 | 鍵值對形式 |
鍵值對形式 | 鍵值對形式 |
- Cache
- 與.NET Framework時代不同,一種全新實現
- IMemoryCache介面
- 依賴注入方式獲取
- IMemoryCache.Get/Set操作資料
[Controller] public class Test : Controller { private readonly IMemoryCache _cache; public Test(IMemoryCache memoryCache) { this._cache = memoryCache; } public IActionResult ReadCache() { _cache.Set("name","tom"); _cache.Get("name"); _cache.Set("age",30); _cache.Get("age"); User tom = new User(){ Name = "admin",Pwd = "123456"}; _cache.Set<User>("user",tom); _cache.Get<User>("user"); return Content("ok"); } } public class User { public string Name { get; set; } public string Pwd { get; set; } }
- ViewStart
- 以_ViewStart.cshtml命名,固定名稱,不能更換
- 一般放在檢視所在目錄的根目錄下
- 自動執行,無需手工呼叫
- 不要再ViewStart中做大量的業務操作
- ViewImport
- 以_ViewImport.cshtml命名,固定名稱,不能更換
- 只作引入操作
- 一般放在檢視所在目錄的根目錄下
- 自動執行,無需手工呼叫
- 檢視中可以使用@using關鍵字引入所需名稱空間
- 通過ViewImport做全域性性的名稱空間引入,減少在每個頁面中引入的工作量
第四課 資料驗證
- 資料驗證特性ValidationAttribute
public abstract class ValidationAttribute : Attribute
{
/// <summary>Initializes a new instance of the <see cref="T:System.ComponentModel.DataAnnotations.ValidationAttribute"></see> class.</summary>
protected ValidationAttribute();
/// <summary>Initializes a new instance of the <see cref="T:System.ComponentModel.DataAnnotations.ValidationAttribute"></see> class by using the function that enables access to validation resources.</summary>
/// <param name="errorMessageAccessor">The function that enables access to validation resources.</param>
/// <exceptioERJRazn cref="T:System.ArgumentNullException"><paramref name="errorMessageAccessor">errorMessageAccessor</paramref> is null.</exception>
protected ValidationAttribute(Func<string> errorMessageAccessor);
/// <summary>Initializes a new instance of the <see cref="T:System.ComponentModel.DataAnnotations.ValidationAttribute"></see> class by using the error message to associate with a validation control.</summary>
/// <param name="errorMessage">The error message to associate with a validation control.</param>
protected ValidationAttribute(string errorMessage);
/// <summary>Gets or sets an error message to associate with a validation control if validation fails.</summary>
/// <returns>The error message that is associated with the validation control.</returns>
public string ErrorMessage { get; set; }
/// <summary>Gets or sets the error message resource name to use in order to look up the <see cref="P:System.ComponentModel.DataAnnotations.ValidationAttribute.ErrorMessageResourceType"></see> property value if validation fails.</summary>
/// <returns>The error message resource that is associated with a validation control.</returns>
public string ErrorMessageResourceName { get; set; }
/// <summary>Gets or sets the resource type to use for error-message lookup if validation fails.</summary>
/// <returns>The type of error message that is associated with a validation control.</returns>
public Type ErrorMessageResourceType { get; set; }
/// <summary>Gets the localized validation error message.</summary>
/// <returns>The localized validation error message.</returns>
protected string ErrorMessageString { get; }
/// <summary>Gets a value that indicates whether the attribute requires validation context.</summary>
/// <returns>true if the attribute requires validation context; otherwise,false.</returns>
public virtual bool RequiresValidationContext { get; }
/// <summary>Applies formatting to an error message,based on the data field where the error occurred.</summary>
/// <param name="name">The name to include in the formatted message.</param>
/// <returns>An instance of the formatted error message.</returns>
public virtual string FormatErrorMessage(strinwww.cppcns.comg name);
/// <summary>Checks whether the specified value is valid with respect to the current validation attribute.</summary>
/// <param name="value">The value to validate.</param>
/// <param name="validationContext">The context information about the validation operation.</param>
/// <returns>An instance of the <see cref="System.ComponentModel.DataAnnotations.ValidationResult"></see> class.</returns>
public ValidationResult GetValidationResult(
object value,ValidationContext validationContext);
/// <summary>Determines whether the specified value of the object is valid.</summary>
/// <param name="value">The value of the object to validate.</param>
/// <returns>true if the specified value is valid; otherwise,false.</returns>
public virtual bool IsValid(object value);
/// <summary>Validates the specified value with respect to the current validation attribute.</summary>
/// <param name="value">The value to validate.</param>
/// <param name="validationContext">The context information about the validation operation.</param>
/// <returns>An instance of the <see cref="System.ComponentModel.DataAnnotations.ValidationResult"></see> class.</returns>
protected virtual ValidationResult IsValid(
object value,ValidationContext validationContext);
/// <summary>Validates the specified object.</summary>
/// <param name="value">The object to validate.</param>
/// <param name="validationContext">The <see cref="T:System.ComponentModel.DataAnnotations.ValidationContext"></see> object that describes the context where the validation checks are performed. This parameter cannot be null.</param>
/// <exception cref="T:System.ComponentModel.DataAnnotations.ValidationException">Validation failed.</exception>
public void Validate(object value,ValidationContext validationContext);
/// <summary>Validates the specified object.</summary>
/// <param name="value">The value of the object to validate.</param>
/// <param name="name">The name to include in the error message.</param>
/// <exception cref="T:System.ComponentModel.DataAnnotations.ValidationException"><paramref name="value">value</paramref> is not valid.</exception>
public void Validate(object value,string name);
}
常用資料驗證
- RequiredAttribute
- RegularExpressionAttribute
- CompareAttribute
- RangeAttribute
- MaxAttribute
- MinAttribute
- StringLengthAttribute
- DataTypeAttribute
伺服器端使用
- 使用包含驗證規則的類接收資料
- 使用ModelState.IsValid判斷是否符合要求
前端使用
- 定義強型別檢視並傳遞包含驗證規則的業務資料模型
- 使用HtmlHelper.ValidationFor初始前端驗證規則
- 使用HtmlHelper.ValidationMessageFor生成提示文字
public class UserLogin { [Required(ErrorMessage = "使用者名稱不能為空")] [StringLength(10,ErrorMessage = "使用者名稱長度不能超過10位")] public string UserName { get; set; } //[Required(ErrorMessage = "密碼不能為空")] [StringLength(6,ErrorMessage = "密碼長度不能超過6位")] public string Password { get; set; } }
public class FormController : Controller { public IActionResult Index() { return View(new UserLogin()); } public IActionResult PostData(UserLogin login) { return Content(ModelState.IsValid?"資料有效":"資料無效"); } }
@model Lesson2.Models.UserLogin @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <script src="~/lib//dist/jquery.min.js"></script> <script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script> </head> <body> <form asp-action="PostData" method="post"> <table> <tr> <td>使用者名稱</td> <td>@Html.TextBoxFor(m => m.UserName)</td> <td>@Html.ValidationMessageFor(m => m.UserName)</td> </tr> <tr> <td>密碼</td> <td>@Html.PasswordFor(m => m.Password)</td> <td>@Html.ValidationMessageFor(m => m.Password)</td> </tr> <tr> <td></td> <td><input type="submit" value="登入" /></td> <td></td> </tr> </table> </form> </body> </html>
第五課 路由規則
路由
- 定義使用者請求與控制器方法之前的對映關係
路由配置
- IRouteBuilder
- 通過MapRoute方法配置路由模板
- IRouteBuilder
app.UseMvc(routes => { routes.MapRoute( name: "default",template: "{controller=Home}/{action=Index}/{id?}"); routes.MapRoute( name: "admin_default",template: "admin/{controller=Home}/{action=Index}/{id?}"); });
- RouteAttribute
- 應用在控制器及方法上
- 通過Template屬性配置路由模板
[Route("admin/form")] public class FormController : Controller { [Route("index")] public IActionResult Index() { return View(new UserLogin()); } public IActionResult PostData(UserLogin login) { return Content(ModelState.IsValid?"資料有效":"資料無效"); } }
- 路由約束
- 對路由資料進行約束
- 只有約束滿足條件才能匹配成功
約束 | 示例 | 說明 |
---|---|---|
required | "Product/{ProductName:required}" | 引數必選 |
alpha | "Product/{ProductName:alpha}" | 匹配字母,大小寫不限 |
int | "Product/{ProductId:int}" | 匹配int型別 |
··· | ··· | ··· |
composite | "Product/{ProductId:composite}" | 匹配composite型別 |
length | "Product/{ProductName:length(5)}" | 長度必須是5個字元 |
length | "Product/{ProductName:length(5)}" | 長度在5-10之間 |
maxlength | "Product/{ProductId:maxlength(10)}" | 最大長度為10 |
minlength | "Product/{ProductId:minlength(3)}" | 最小長度為3 |
min | "Product/{ProductId:min(3)}" | 大於等於3 |
max | "Product/{ProductId:max(10)}" | 小於等於10 |
range | "Product/{ProductId:range(5,10)}" | 對應的陣列在5-10之間 |
regex | "Product/{ProductId:regex(^\d{4}$)}" | 符合指定的正則表示式 |
- 路由資料
- 路由資料也是請求資料的一部分
- 路由資料與表單資料一樣,也可以繫結到引數上
- 預設是通過名稱進行匹配,也可以通過
FormRouteAttribute
匹配引數與路由資料的對映關係
public IActionResult Index([FromRoute] int? id) { return View(); }
第六課 應用釋出與部署
- 釋出
- 釋出方法
- 使用Visual Studio釋出應用:專案右鍵 -> 釋出 -> 釋出方式選擇...
- 使用dotnet publish命令列工具釋出:dotnet publish --configuration Release --runtime win7-x64 --output c:\svc
- 釋出方法
- 檢視預編譯
- 少了執行時編譯過程,啟動速度快
- 預編譯後,整個程式包更小
- 可以通過MvcRazorCompileOnPublish配置是否開啟,預設是開啟狀態
- 關閉檢視預編譯:
- 開啟專案的.csproj檔案
- 配置MvcRazorCompileOnPublish為false
- 關閉檢視預編譯:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp2.1</TargetFramework> <!-- 關閉檢視預編譯 --> <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.App" /> <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All" /> <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.1" /> </ItemGroup> </Project>
- 部署
- IIS 部署
- 目標機器安裝對應版本的.NET Core Sdk
- 安裝.NET Core Windows Server 託管程式
- 應用程式池的“.NET CLR版本”設定為“無託管程式碼”
- 自宿主釋出
- 釋出成一個exe直接執行
- 不用依賴IIS
- RuntimeIdentifier
- .NET Core RID Catalog
- IIS 部署
<!-- 依賴框架的部署 (FDD) --> <PropertyGroup> <TargetFramework>netcoreapp2.2</TargetFramework> <RuntimeIdentifier>win7-x64</RuntimeIdentifier> <SelfContained>false</SelfContained> <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled> </PropertyGroup> <!-- 獨立部署 (SCD) --> <PropertyGroup> <TargetFramework>netcoreapp2.2</TargetFramework> <RuntimeIdentifier>win7-x64</RuntimeIdentifier> <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled> </PropertyGroup> ... ... ...
原始碼地址
- DncLesson
到此這篇關於ASP.NET CORE基礎教程的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援我們。