欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET?Core?MVC中的模型(Model)

 更新時(shí)間:2022年04月13日 15:22:43   作者:Ruby_Lu  
這篇文章介紹了ASP.NET?Core?MVC中的模型(Model),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1.模型綁定

ASP.NET Core MVC 中的模型綁定將數(shù)據(jù)從HTTP請(qǐng)求映射到操作方法參數(shù)。參數(shù)既可以是簡(jiǎn)單類型,也可以是復(fù)雜類型。MVC 通過(guò)抽象綁定解決了這個(gè)問(wèn)題。

2.使用模型綁定

當(dāng) MVC 收到一個(gè)HTTP 請(qǐng)求時(shí),它會(huì)將其路由到一個(gè)控制器指定的操作方法。它基于路由數(shù)據(jù)來(lái)決定運(yùn)行哪個(gè)操作,然后將值從HTTP請(qǐng)求綁定到操作方法的參數(shù)中,例如

http://afei.com/movies/edit/2

movies/edit/2 通過(guò)路由模板路由到 Movies 控制器的 Edit 方法,同時(shí)接收到一個(gè)可選參數(shù) id 。URL 中的字符串是不區(qū)分大小寫的。

MVC 將嘗試通過(guò)名稱將請(qǐng)求數(shù)據(jù)綁定到操作參數(shù)上。 MVC 將使用參數(shù)名稱和其公共可設(shè)置的屬性名稱查找每個(gè)參數(shù)值。上面的例子,唯一的操作參數(shù)被命名為 id ,其中 MVC 綁定到路由值中具有相同名稱的值。除了 路由值, MVC 還綁定請(qǐng)求的各個(gè)部分的數(shù)據(jù),并按照設(shè)置的順序這樣做。

模型綁定查找數(shù)據(jù)源的順序列表:

  • 1. Form values : 通過(guò) HTTP POST 請(qǐng)求發(fā)送的表單數(shù)據(jù)(包括 jQuery POST 請(qǐng)求)。
  • 2. Route values :由 routing 提供的路由數(shù)據(jù)集。
  • 3. Query string : URL 的查詢字符串的一部分。

表單值,路由數(shù)據(jù)以及查詢字符串都是以鍵值對(duì)的形式存儲(chǔ)的。

因?yàn)槟P徒壎ㄒ乙粋€(gè)名為 id 的鍵,但是表單中沒(méi)有,所以接下來(lái)在路由數(shù)據(jù)中找尋。綁定發(fā)生時(shí),該值轉(zhuǎn)換為整數(shù)類型的 2 。使用 Edit(string id)的同一請(qǐng)求轉(zhuǎn)換為字符串 “2” .

如果Action 方法的參數(shù)是一個(gè)類,比如 Movies 類型,盡管這個(gè)類包含簡(jiǎn)單類型和復(fù)雜類型的屬性,MVC 也可以模型綁定。它使用反射和遞歸遍歷復(fù)雜類型尋找匹配的屬性。模型綁定尋找 parameter_name.property_name 的模式去綁定值到屬性上。如果沒(méi)有從表單中找到匹配的值,則嘗試只通過(guò) property_name  進(jìn)行綁定。對(duì)于集合類型,模型綁定會(huì)去匹配 parameter_name[index] 或只是 [index] 。模型綁定對(duì)待字典類型也是一樣,前提是Key 是簡(jiǎn)單類型。Key 支持匹配HTML 和 Tag Helpers 為相同的模型類型生成的字段名。當(dāng)創(chuàng)建或編輯的綁定數(shù)據(jù)未通過(guò)驗(yàn)證時(shí),回傳值使得用戶輸入的表單字段仍然保留,方便用戶輸入。

為了發(fā)生綁定,類必須具有公共默認(rèn)的構(gòu)造函數(shù),要綁定的成員必須是公共可寫的屬性,當(dāng)綁定發(fā)生時(shí),類只會(huì)使用公共默認(rèn)的構(gòu)造函數(shù),然后設(shè)置屬性。

當(dāng)一個(gè)參數(shù)被綁定后,模型綁定停止尋找具有該名稱的值,并繼續(xù)綁定下一個(gè)參數(shù)。如果綁定失敗,MVC  也不會(huì)拋出異常,可以通過(guò)ModelState.IsValid 屬性來(lái)查詢模型狀態(tài)錯(cuò)誤。

在執(zhí)行綁定時(shí),需要考慮一些特殊的數(shù)據(jù)類型:

  • IFormFile , IEnumerable<IFormFile> :作為 HTTP 請(qǐng)求一部分的一個(gè)或多個(gè)上傳的文件。
  • CancelationToken : 用于取消一部控制器中的活動(dòng)。

這些類型可以綁定到操作參數(shù)或類的屬性上。

一旦模型綁定完成,就會(huì)進(jìn)行驗(yàn)證。默認(rèn)模型綁定適合絕大多數(shù)開發(fā)場(chǎng)景,同時(shí)也可以自定義內(nèi)置的行為。

3.通過(guò)特性自定義模型綁定行為

MVC 包含集中可以指定與默認(rèn)綁定源不同行為的特性。比如,可以通過(guò)使用 [BindRequired] 或 [BindNever] 特性指定一個(gè)屬性是否需要綁定,或者是否該發(fā)生。而且可以覆蓋默認(rèn)數(shù)據(jù)源,指定模型綁定器的數(shù)據(jù)源。

  • [BindRequired] :如果不發(fā)生綁定,將添加模型狀態(tài)錯(cuò)誤。
  • [BingNever] : 告訴模型綁定從不綁定到此參數(shù)。
  • [FromHeader] , [FromQuery] , [FromRoute] , [FromForm] : 使用這些來(lái)指定應(yīng)用的確切綁定源。
  • [FromServices] : 此特性使用依賴注入來(lái)綁定服務(wù)的參數(shù)。
  • [FromBody] : 使用配置的格式化程序綁定請(qǐng)求主體中的數(shù)據(jù),基于請(qǐng)求的內(nèi)容類型選擇格式化器。
  • [ModelBinder] : 用于覆蓋默認(rèn)模型綁定器,綁定源和名稱。

4.從請(qǐng)求主體綁定格式化的數(shù)據(jù)

HTTP 請(qǐng)求數(shù)據(jù)支持各種的格式,包括 JSON , XML 以及其他格式。當(dāng)使用 [FromBody] 特性的時(shí)候,表示要從請(qǐng)求主體中綁定參數(shù)。MVC 使用一組配置的格式化程序來(lái)根據(jù)其內(nèi)容類型處理請(qǐng)求數(shù)據(jù)。默認(rèn)情況下,MVC 包含一個(gè) JsonInputFormatter 類來(lái)處理JSON數(shù)據(jù),當(dāng)然也可以添加其他格式化程序來(lái)處理XML 和其他自定義格式。

每個(gè)操作最多可以有一個(gè) [Frombody] 裝飾的參數(shù)。ASP.NET Core MVC 運(yùn)行時(shí)將讀取請(qǐng)求流的職責(zé)委托給格式化程序。一旦讀取了參數(shù)的請(qǐng)求流,通常不可能再次讀取請(qǐng)求流以綁定其他 [FromBody] 參數(shù)。

ASP.NET 基于Content-Type 頭和參數(shù)的類型來(lái)選擇輸入格式化程序。如果想用 XML 或者其他格式,則必須在 Startup.cs 文件中配置它,但首先使用 NuGet 來(lái)獲取 Microsoft.AspNetCore.Mvc.Formatters.Xml 引用。啟動(dòng)代碼如下:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
                .AddXmlSerializerFormatters();
        }

示例中,我們添加一個(gè)XML 格式化程序作為此MVC應(yīng)用程序提供的服務(wù)。傳遞給 AddMvc 方法的 options參數(shù)允許在應(yīng)用程序啟動(dòng)時(shí)從MVC添加和管理過(guò)濾器,格式化程序和其他系統(tǒng)選項(xiàng),然后應(yīng)用各種特性到控制器類或方法上實(shí)現(xiàn)預(yù)期的效果。

5.模型驗(yàn)證

在應(yīng)用程序?qū)?shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)之前,應(yīng)用程序必須驗(yàn)證數(shù)據(jù)。對(duì)于數(shù)據(jù)必須檢查其是否存在潛在的安全隱患,驗(yàn)證類型和大小是否正確并且符合所定制的規(guī)則。盡管驗(yàn)證的實(shí)現(xiàn)可能時(shí)冗余且繁瑣的,但是必要的。在 MVC 中,驗(yàn)證可以發(fā)生在客戶端和服務(wù)端。

.NET 已經(jīng)將驗(yàn)證抽象為驗(yàn)證特性。這些特性包含驗(yàn)證代碼,從而減少必須編碼。

public class Movies
    {
        public int Id { get; set; }

        [Required]
        [StringLength(100)]
        public string Title { get; set; }
        [Required]
        [ClassicMovie(1996)]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        [Required]
        [StringLength(100)]
        public string Description { get; set; }
        [Required]
        [Range(0,999.99)]
        public decimal Price { get; set; }
        [Required]
        public Genre Genre { get; set; }
        public bool Preorder { get; set; }
    }

常見內(nèi)置驗(yàn)證屬性:

  • [CreditCard] : 驗(yàn)證屬性是否為信用卡格式
  • [Compare] : 驗(yàn)證模型中的兩個(gè)屬性是否匹配
  • [EmailAddress] : 驗(yàn)證屬性是否為電子郵件格式
  • [Phone] : 驗(yàn)證屬性是否為電話號(hào)碼格式
  • [Range] : 驗(yàn)證屬性值是否在給定范圍內(nèi)
  • [RegularExpression] : 驗(yàn)證數(shù)據(jù)是否與指定的正則表達(dá)式匹配
  • [Required] : 必填的屬性
  • [StringLength] : 驗(yàn)證字符串屬性的最大長(zhǎng)度
  • [Url] : 驗(yàn)證屬性是否為網(wǎng)址格式

MVC 支持從 ValidationAttribute 派生的任何特性或者更改模型來(lái)實(shí)現(xiàn) IAlidatableObject 即創(chuàng)建自定義驗(yàn)證特性以用于驗(yàn)證目的。許多內(nèi)置的驗(yàn)證特性可以在 ystem.ComponentModel.DataAnnotations 中找到。

有時(shí)候我們需要手動(dòng)需要驗(yàn)證模型,可以調(diào)用 TryValidateModel 方法來(lái)驗(yàn)證,如 TryValidateModel (movie)。

模型狀態(tài)表示在HTML表單提交值的一系列驗(yàn)證錯(cuò)誤。MVC 將持續(xù)驗(yàn)證字段直到錯(cuò)誤數(shù)達(dá)到最大值(默認(rèn)200)。可以在 ConfigureServices 方法中配置這個(gè)最大值:

services.AddMvc(options => options.MaxModelValidationErrors = 500);

模型驗(yàn)證發(fā)生在每個(gè)控制器的操作 被調(diào)用之前,而檢查 ModelState.IsValid 和做出適當(dāng)?shù)姆磻?yīng)時(shí)操作方法的職責(zé)。許多情況下,適當(dāng)?shù)姆磻?yīng)是返回某種錯(cuò)誤響應(yīng),理想情況下則是詳細(xì)介紹模型驗(yàn)證失敗的原因。

6.自定義驗(yàn)證

實(shí)現(xiàn)自定義驗(yàn)證的方法很簡(jiǎn)單,只需要繼承 ValidationAttribute,并且重寫 IsValid 方法即可。IsValid 方法接受兩個(gè)參數(shù),第一個(gè)是名為 value 的 object 對(duì)象,第二個(gè)對(duì)象是名為validationContext 的 ValidationContext 對(duì)象。value 指的是自定義驗(yàn)證器驗(yàn)證的字段的值。

下面自定義[ClassicMovie] 特性,該特性檢查 Movies 類的 ReleaseDate 年份是否大于1960:

public class ClassicMovieAttribute:ValidationAttribute
    {
        private int _year;

        public ClassicMovieAttribute(int Year)
        {
            _year = Year;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            Movies movie = (Movies)validationContext.ObjectInstance;
            if (movie.ReleaseDate.Year > _year)
            {
                return new ValidationResult("發(fā)布年份不能大于"+_year);
            }
            return ValidationResult.Success;
        }
    }

這個(gè)例子只對(duì) Movies 類型有效,因?yàn)樵?nbsp;IsValid 方法中硬編碼了  Movies 類型。一個(gè)更好的選擇是 IValidationObject。

通過(guò)在 IValidatableObject 接口上實(shí)現(xiàn) Validate 方法,可以將相同的代碼放在模型中。雖然自定義驗(yàn)證屬性是用于驗(yàn)證單個(gè)屬性,但實(shí)現(xiàn) IValidationObject 可用于實(shí)現(xiàn)類級(jí)別驗(yàn)證;

public class Movies: IValidatableObject
    {
        private int _classicYear = 1960;
        public int Id { get; set; }

        [Required]
        [StringLength(100)]
        public string Title { get; set; }
        [Required]
        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        [Required]
        [StringLength(100)]
        public string Description { get; set; }
        [Required]
        [Range(0,999.99)]
        public decimal Price { get; set; }
        public bool Preorder { get; set; }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (ReleaseDate.Year > _classicYear)
            {
                yield return new ValidationResult("發(fā)布年份不能大于" + _classicYear,new[] { "ReleaseDate" });
            }
        }
    }

7.客戶端驗(yàn)證

客戶端驗(yàn)證帶來(lái)了極大便利,它可以節(jié)省時(shí)間,不必花費(fèi)一個(gè)來(lái)回時(shí)間等待服務(wù)器的驗(yàn)證結(jié)果。

你必須引用 Javascript 腳本來(lái)進(jìn)行客戶端驗(yàn)證;

jquery-x.x.x.min.js    jquery.validate.min.js     jquery.validate.unobtrusive.min.js

<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-tsQFqpEReu7ZLhBV2VZlAu7zcOV+rXbYlF2cqB8txI/8aZajjp4Bqd+V6D5IgvKT">
        </script>
    <script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.17.0/jquery.validate.min.js"
            asp-fallback-src="~/lib/jquery-validation/dist/jquery.validate.min.js"
            asp-fallback-test="window.jQuery && window.jQuery.validator"
            crossorigin="anonymous"
            integrity="sha384-rZfj/ogBloos6wzLGpPkkOr/gpkBNLZ6b6yLy4o+ok+t/SAKlL5mvXLr0OXNi1Hp">
    </script>
    <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.9/jquery.validate.unobtrusive.min.js"
            asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
            asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
            crossorigin="anonymous"
            integrity="sha384-ifv0TYDWxBHzvAk2Z0n8R434FL1Rlv/Av18DXE43N/1rvHyOG4izKst0f2iSLdds">
    </script>

除了模型屬性的類型元數(shù)據(jù)外,MVC 還用 Attribute 通過(guò) Javascript 驗(yàn)證數(shù)據(jù)并展示所有錯(cuò)誤信息。當(dāng)使用 MVC 去渲染使用 Tag Helper 或者 HTML Helpers 的表單數(shù)據(jù)時(shí),它將在需要驗(yàn)證的表單元素中添加HTML  5  data- attributes ,如下面,MVC 對(duì)內(nèi)置驗(yàn)證 Attribute 和自定義驗(yàn)證 Attribute 生成 data - 特性??梢酝ㄟ^(guò) Tag Helper 在客戶端顯示驗(yàn)證錯(cuò)誤:

<div class="form-group">
                <label asp-for="Id" class="control-label"></label>
                <input asp-for="Id" class="form-control" />
                <span asp-validation-for="Id" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ReleaseDate" class="control-label"></label>
                <input asp-for="ReleaseDate" class="form-control" />
                <span asp-validation-for="ReleaseDate" class="text-danger"></span>
            </div>

上面的 Tag Helper  渲染的 HTML 如下,注意輸出的 HTML 中,data-特性對(duì)應(yīng) Name 屬性的驗(yàn)證 Attribute ,data-val-required 特性包含一個(gè)用于展示錯(cuò)誤消息,如果沒(méi)填寫 ReleaseDate 字段,則錯(cuò)誤消息將隨著<span>  一起顯示:

<div class="form-group">
                <label class="control-label" for="Id">Id</label>
                <input name="Id" class="form-control" id="Id" type="number" value="" data-val-required="The Id field is required." data-val="true">
                <span class="text-danger field-validation-valid" data-valmsg-replace="true" data-valmsg-for="Id"></span>
            </div>
<div class="form-group">
                <label class="control-label" for="ReleaseDate">ReleaseDate</label>
                <input name="ReleaseDate" class="form-control" id="ReleaseDate" data-val-required="The ReleaseDate field is required." data-val="true"
type="text" value=""> <span class="text-danger field-validation-valid" data-valmsg-replace="true" data-valmsg-for="ReleaseDate"></span> </div>

客戶端驗(yàn)證防止表單提交直到有效為止。無(wú)論提交表單還是顯示錯(cuò)誤信息,提交按鈕都會(huì)執(zhí)行 Javascript 代碼。

MVC 基于 .NET 屬性的數(shù)據(jù)類型決定了類型特性值??梢允褂?[DataType] 特性來(lái)覆蓋?;A(chǔ)的  [DataType]  特性并不是真正的服務(wù)端驗(yàn)證。瀏覽器選擇自己的錯(cuò)誤信息,并顯示,但 Jquery Validation Unobtrusive 包可以重寫消息,并讓他們顯示方式一致。

8.遠(yuǎn)程驗(yàn)證

當(dāng)需要在客戶端上使用服務(wù)器上的數(shù)據(jù)進(jìn)行驗(yàn)證的時(shí)候,遠(yuǎn)程驗(yàn)證是一個(gè)很好的功能。比如,應(yīng)用程序需要驗(yàn)證一個(gè)用戶名是否已經(jīng)被使用,并且需要查詢大量數(shù)據(jù)才能執(zhí)行。下載大量數(shù)據(jù)驗(yàn)證會(huì)占用大量資源,也可能暴露敏感信息。另一個(gè)辦法是使用回傳請(qǐng)求來(lái)驗(yàn)證。

兩個(gè)步驟就可以實(shí)現(xiàn)遠(yuǎn)程驗(yàn)證,首先必須使用 [Remote] 特性注釋模型屬性。 [Remote] 特性接受多個(gè)重載,可以使用它將客戶端 Javascript 定向到要調(diào)用的相應(yīng)代碼。下面的代碼時(shí)執(zhí)行 Users 控制器的 VerfyUser 方法:

public class User
    {
        [Remote(action: "VerfyUser",controller:"Users")]
        public string Name { get; set; }
    }

然后在 VerfyUser 方法中實(shí)現(xiàn)方法,它返回一個(gè) JsonResult :

public class UsersController : Controller
    {
        public IActionResult VerfyUser(string name)
        {
            if (!_usersRepository.VerfyUser(name))
            {
                return Json(data:$"{name} 已存在");
            }
            return Json(data:true);
        }
}

現(xiàn)在,當(dāng)用戶輸入名字時(shí),視圖中的 JavaScript 會(huì)進(jìn)行遠(yuǎn)程調(diào)用進(jìn)行驗(yàn)證。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ASP.NET中Label控件用法詳解

    ASP.NET中Label控件用法詳解

    本文主要介紹Label控件的詳細(xì)用法,雖然很基礎(chǔ),但是我感覺(jué)很有必要,希望對(duì)大家有所幫助。
    2016-04-04
  • ASP.NET 中ImageMap控件的用法

    ASP.NET 中ImageMap控件的用法

    本文主要介紹ImageMap控件的使用方法,并做了簡(jiǎn)單的代碼演示,希望能幫到大家。
    2016-04-04
  • ASP.NET?Core中的Configuration配置一

    ASP.NET?Core中的Configuration配置一

    這篇文章介紹了ASP.NET?Core中的Configuration配置,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • asp.net中將某字符串切割成陣列并排序列出

    asp.net中將某字符串切割成陣列并排序列出

    老師布置的另外一道題是將字符串"a;b;d;z;y;u"切割成陣列并排序列出。老師出這題也許是讓Insus.NET掌握或復(fù)習(xí)Array.Sort()函數(shù),不管怎樣,先按自己的想法實(shí)現(xiàn),然后是等老師的意見
    2012-05-05
  • ASP.NET中Image控件使用詳解

    ASP.NET中Image控件使用詳解

    本文詳細(xì)介紹了Image控件的使用方法,用實(shí)例演示了Image控件的用法,希望對(duì)大家有所幫助。
    2016-04-04
  • ASP.NET中FileUpload文件上傳控件應(yīng)用實(shí)例

    ASP.NET中FileUpload文件上傳控件應(yīng)用實(shí)例

    本文主要介紹FileUpload文件上傳控件在實(shí)際開發(fā)中經(jīng)常遇到的問(wèn)題并給出解決方法,希望對(duì)大家有所幫助。
    2016-04-04
  • c#對(duì)xml的簡(jiǎn)單操作

    c#對(duì)xml的簡(jiǎn)單操作

    c#對(duì)xml的簡(jiǎn)單操作...
    2006-08-08
  • WPF基本控件介紹

    WPF基本控件介紹

    這篇文章介紹了WPF的控件結(jié)構(gòu)及各種控件類型,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • 搭建基礎(chǔ)結(jié)構(gòu)的ABP解決方案介紹

    搭建基礎(chǔ)結(jié)構(gòu)的ABP解決方案介紹

    這篇文章介紹了搭建基礎(chǔ)結(jié)構(gòu)的ABP解決方案的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • ASP.NET 中 Button、LinkButton和ImageButton 三種控件的使用詳解

    ASP.NET 中 Button、LinkButton和ImageButton 三種控件的使用詳解

    本文主要介紹Button、LinkButton和ImageButton 三種控件的使用方法,并一一舉例演示它們的用法,希望對(duì)大家有所幫助。
    2016-04-04

最新評(píng)論