ASP.NET CORE 入門教程
第一課 基本概念
- 基本概念
- Asp.Net Core Mvc是.NET Core平臺下的一種Web應用開發框架
- 符合Web應用特色
- .NET Core跨平臺解決方案
- MVC設計模式的一種實現
- 環境準備
第二課 控制器的介紹
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的封裝 |
支持任意類型 |
動態屬性 |
視圖級別 |
應用程序級別 |
會話級別 |
只容許消費一次 |
服務器端保存 |
服務器端保存 |
可屢次賦值 |
可設置有效期 |
鍵值對形式 |
鍵值對形式 |
鍵值對形式 |
|
- 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>
第五課 路由規則
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>
<!-- 依賴框架的部署 (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>
...
...
...
源碼地址