ASP.NET CORE 入門教程(附原始碼)

班納青辰發表於2019-06-15

ASP.NET CORE 入門教程

第一課 基本概念

  • 基本概念
    • Asp.Net Core Mvc是.NET Core平臺下的一種Web應用開發框架
      • 符合Web應用特點
      • .NET Core跨平臺解決方案
      • MVC設計模式的一種實現
  • 環境準備

第二課 控制器的介紹

  • 控制器定義方式:
    • 命名以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
    • 動作結果介面
    • 具體實現
      • JsonResult:返回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>
    /// <exception 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(string 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/jquery/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方法配置路由模板
    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檔案
        • 配置MvcRazorCompileOnPublishfalse
<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>
<!-- 依賴框架的部署 (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 喜歡的話,請Star一下哦。你的支援是我們源源不斷更新的動力!

相關文章