iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ASP.NET Core MVC中的模型怎么使用
  • 555
分享到

ASP.NET Core MVC中的模型怎么使用

2023-06-30 01:06:26 555人浏览 独家记忆
摘要

本篇内容介绍了“asp.net Core mvc中的模型怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.模型绑

本篇内容介绍了“asp.net Core mvc中的模型怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1.模型绑定

ASP.net core MVC 中的模型绑定将数据从Http请求映射到操作方法参数。参数既可以是简单类型,也可以是复杂类型。MVC 通过抽象绑定解决了这个问题。

2.使用模型绑定

当 MVC 收到一个HTTP 请求时,它会将其路由到一个控制器指定的操作方法。它基于路由数据来决定运行哪个操作,然后将值从HTTP请求绑定到操作方法的参数中,例如

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

movies/edit/2 通过路由模板路由到 Movies 控制器的 Edit 方法,同时接收到一个可选参数 id 。URL 中的字符串是不区分大小写的。

MVC 将尝试通过名称将请求数据绑定到操作参数上。 MVC 将使用参数名称和其公共可设置的属性名称查找每个参数值。上面的例子,唯一的操作参数被命名为 id ,其中 MVC 绑定到路由值中具有相同名称的值。除了 路由值, MVC 还绑定请求的各个部分的数据,并按照设置的顺序这样做。

模型绑定查找数据源的顺序列表:

  • FORM values : 通过 HTTP POST 请求发送的表单数据(包括 Jquery POST 请求)。

  • Route values :由 routing 提供的路由数据集。

  • Query string : URL 的查询字符串的一部分。

表单值,路由数据以及查询字符串都是以键值对的形式存储的。

因为模型绑定要找一个名为 id 的键,但是表单中没有,所以接下来在路由数据中找寻。绑定发生时,该值转换为整数类型的 2 。使用 Edit(string id)的同一请求转换为字符串 “2” .

如果Action 方法的参数是一个类,比如 Movies 类型,尽管这个类包含简单类型和复杂类型的属性,MVC 也可以模型绑定。它使用反射递归遍历复杂类型寻找匹配的属性。模型绑定寻找 parameter_name.property_name 的模式去绑定值到属性上。如果没有从表单中找到匹配的值,则尝试只通过 property_name  进行绑定。对于集合类型,模型绑定会去匹配 parameter_name[index] 或只是 [index] 。模型绑定对待字典类型也是一样,前提是Key 是简单类型。Key 支持匹配html 和 Tag Helpers 为相同的模型类型生成的字段名。当创建或编辑的绑定数据未通过验证时,回传值使得用户输入的表单字段仍然保留,方便用户输入。

为了发生绑定,类必须具有公共默认的构造函数,要绑定的成员必须是公共可写的属性,当绑定发生时,类只会使用公共默认的构造函数,然后设置属性。

当一个参数被绑定后,模型绑定停止寻找具有该名称的值,并继续绑定下一个参数。如果绑定失败,MVC  也不会抛出异常,可以通过ModelState.IsValid 属性来查询模型状态错误。

在执行绑定时,需要考虑一些特殊的数据类型:

  • IFormFile , IEnumerable<IFormFile> :作为 HTTP 请求一部分的一个或多个上传的文件。

  • CancelationToken : 用于取消一部控制器中的活动。

这些类型可以绑定到操作参数或类的属性上。

一旦模型绑定完成,就会进行验证。默认模型绑定适合绝大多数开发场景,同时也可以自定义内置的行为。

3.通过特性自定义模型绑定行为

MVC 包含集中可以指定与默认绑定源不同行为的特性。比如,可以通过使用 [BindRequired] 或 [BindNever] 特性指定一个属性是否需要绑定,或者是否该发生。而且可以覆盖默认数据源,指定模型绑定器的数据源。

  • [BindRequired] :如果不发生绑定,将添加模型状态错误。

  • [BingNever] : 告诉模型绑定从不绑定到此参数。

  • [FromHeader] , [FroMQuery] , [FromRoute] , [FromForm] : 使用这些来指定应用的确切绑定源。

  • [FromServices] : 此特性使用依赖注入来绑定服务的参数。

  • [FromBody] : 使用配置的格式化程序绑定请求主体中的数据,基于请求的内容类型选择格式化器。

  • [ModelBinder] : 用于覆盖默认模型绑定器,绑定源和名称。

4.从请求主体绑定格式化的数据

HTTP 请求数据支持各种的格式,包括 JSON , XML 以及其他格式。当使用 [FromBody] 特性的时候,表示要从请求主体中绑定参数。MVC 使用一组配置的格式化程序来根据其内容类型处理请求数据。默认情况下,MVC 包含一个 jsonInputFormatter 类来处理JSON数据,当然也可以添加其他格式化程序来处理XML 和其他自定义格式。

每个操作最多可以有一个 [Frombody] 装饰的参数。ASP.net core MVC 运行时将读取请求流的职责委托给格式化程序。一旦读取了参数的请求流,通常不可能再次读取请求流以绑定其他 [FromBody] 参数。

ASP.net 基于Content-Type 头和参数的类型来选择输入格式化程序。如果想用 XML 或者其他格式,则必须在 Startup.cs 文件中配置它,但首先使用 NuGet 来获取 Microsoft.Aspnetcore.Mvc.Formatters.Xml 引用。启动代码如下:

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

示例中,我们添加一个XML 格式化程序作为此MVC应用程序提供的服务。传递给 AddMvc 方法的 options参数允许在应用程序启动时从MVC添加和管理过滤器,格式化程序和其他系统选项,然后应用各种特性到控制器类或方法上实现预期的效果。

5.模型验证

在应用程序将数据存储到数据库之前,应用程序必须验证数据。对于数据必须检查其是否存在潜在的安全隐患,验证类型和大小是否正确并且符合所定制的规则。尽管验证的实现可能时冗余且繁琐的,但是必要的。在 MVC 中,验证可以发生在客户端和服务端。

.NET 已经将验证抽象为验证特性。这些特性包含验证代码,从而减少必须编码。

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; }    }

常见内置验证属性:

  • [CreditCard] : 验证属性是否为信用卡格式

  • [Compare] : 验证模型中的两个属性是否匹配

  • [EmailAddress] : 验证属性是否为电子邮件格式

  • [Phone] : 验证属性是否为电话号码格式

  • [Range] : 验证属性值是否在给定范围内

  • [RegularExpression] : 验证数据是否与指定的正则表达式匹配

  • [Required] : 必填的属性

  • [StringLength] : 验证字符串属性的最大长度

  • [Url] : 验证属性是否为网址格式

MVC 支持从 ValidationAttribute 派生的任何特性或者更改模型来实现 IAlidatableObject 即创建自定义验证特性以用于验证目的。许多内置的验证特性可以在 ystem.ComponentModel.DataAnnotations 中找到。

有时候我们需要手动需要验证模型,可以调用 TryValidateModel 方法来验证,如 TryValidateModel (movie)。

模型状态表示在HTML表单提交值的一系列验证错误。MVC 将持续验证字段直到错误数达到最大值(默认200)。可以在 ConfigureServices 方法中配置这个最大值:

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

模型验证发生在每个控制器的操作 被调用之前,而检查 ModelState.IsValid 和做出适当的反应时操作方法的职责。许多情况下,适当的反应是返回某种错误响应,理想情况下则是详细介绍模型验证失败的原因。

6.自定义验证

实现自定义验证的方法很简单,只需要继承 ValidationAttribute,并且重写 IsValid 方法即可。IsValid 方法接受两个参数,第一个是名为 value 的 object 对象,第二个对象是名为validationContext 的 ValidationContext 对象。value 指的是自定义验证器验证的字段的值。

下面自定义[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("发布年份不能大于"+_year);            }            return ValidationResult.Success;        }    }

这个例子只对 Movies 类型有效,因为在 IsValid 方法中硬编码了  Movies 类型。一个更好的选择是 IValidationObject。

通过在 IValidatableObject 接口上实现 Validate 方法,可以将相同的代码放在模型中。虽然自定义验证属性是用于验证单个属性,但实现 IValidationObject 可用于实现类级别验证;

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("发布年份不能大于" + _classicYear,new[] { "ReleaseDate" });            }        }    }

7.客户端验证

客户端验证带来了极大便利,它可以节省时间,不必花费一个来回时间等待服务器的验证结果。

你必须引用 javascript 脚本来进行客户端验证;

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>

除了模型属性的类型元数据外,MVC 还用 Attribute 通过 Javascript 验证数据并展示所有错误信息。当使用 MVC 去渲染使用 Tag Helper 或者 HTML Helpers 的表单数据时,它将在需要验证的表单元素中添加HTML  5  data- attributes ,如下面,MVC 对内置验证 Attribute 和自定义验证 Attribute 生成 data - 特性。可以通过 Tag Helper 在客户端显示验证错误:

<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-特性对应 Name 属性的验证 Attribute ,data-val-required 特性包含一个用于展示错误消息,如果没填写 ReleaseDate 字段,则错误消息将随着<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>

客户端验证防止表单提交直到有效为止。无论提交表单还是显示错误信息,提交按钮都会执行 Javascript 代码。

MVC 基于 .NET 属性的数据类型决定了类型特性值。可以使用 [DataType] 特性来覆盖。基础的  [DataType]  特性并不是真正的服务端验证。浏览器选择自己的错误信息,并显示,但 Jquery Validation Unobtrusive 包可以重写消息,并让他们显示方式一致。

8.远程验证

当需要在客户端上使用服务器上的数据进行验证的时候,远程验证是一个很好的功能。比如,应用程序需要验证一个用户名是否已经被使用,并且需要查询大量数据才能执行。下载大量数据验证会占用大量资源,也可能暴露敏感信息。另一个办法是使用回传请求来验证。

两个步骤就可以实现远程验证,首先必须使用 [Remote] 特性注释模型属性。 [Remote] 特性接受多个重载,可以使用它将客户端 Javascript 定向到要调用的相应代码。下面的代码时执行 Users 控制器的 VerfyUser 方法:

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

然后在 VerfyUser 方法中实现方法,它返回一个 JsonResult :

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

现在,当用户输入名字时,视图中的 JavaScript 会进行远程调用进行验证。

“ASP.NET Core MVC中的模型怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: ASP.NET Core MVC中的模型怎么使用

本文链接: https://www.lsjlt.com/news/327031.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ASP.NET Core MVC中的模型怎么使用
    本篇内容介绍了“ASP.NET Core MVC中的模型怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.模型绑...
    99+
    2023-06-30
  • ASP.NET Core MVC中的模型(Model)
    目录1.模型绑定2.使用模型绑定3.通过特性自定义模型绑定行为4.从请求主体绑定格式化的数据5.模型验证6.自定义验证7.客户端验证8.远程验证1.模型绑定 ASP.NET Core...
    99+
    2024-04-02
  • ASP.NET Core MVC中的视图怎么用
    本篇内容介绍了“ASP.NET Core MVC中的视图怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ASP.NE...
    99+
    2023-06-30
  • ASP.NET Core中MVC模式怎么实现路由
    这篇“ASP.NET Core中MVC模式怎么实现路由”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ASP.NET...
    99+
    2023-06-29
  • ASP.NET Core怎么使用EF创建模型
    这篇文章主要介绍“ASP.NET Core怎么使用EF创建模型”,在日常操作中,相信很多人在ASP.NET Core怎么使用EF创建模型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ASP...
    99+
    2023-06-29
  • ASP.NET Core MVC中Form Tag Helpers怎么用
    这篇文章主要介绍了ASP.NET Core MVC中Form Tag Helpers怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下...
    99+
    2023-06-29
  • ASP.NET Core MVC中的标签TagHelper怎么用
    本篇内容主要讲解“ASP.NET Core MVC中的标签TagHelper怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET Core ...
    99+
    2023-06-30
  • ASP.NET Core MVC路由怎么用
    本篇内容介绍了“ASP.NET Core MVC路由怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! AS...
    99+
    2023-06-30
  • ASP.NET Core MVC中使用Tag Helper组件
    Tag Helper 组件 - 简介 之前我们已经在几个文章中谈到了Tag Helpers,这一次我们会讨论其它有关的事情。 在 ASP.NET Core 2 还为我们带来了一个新功...
    99+
    2024-04-02
  • ASP.NET Core怎么使用EF创建关系模型
    今天小编给大家分享一下ASP.NET Core怎么使用EF创建关系模型的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-06-29
  • ASP.NET Core中MVC模式实现路由一
    目录1.前言2.设置路由中间件3.传统路由4.多个路由4.1定义多个路由4.2区分操作5.属性路由5.1 属性路由5.2 使用 Http[Verb] 属性的属性路由5.3合并路由5....
    99+
    2024-04-02
  • ASP.NET Core中MVC模式实现路由二
    目录1.URL生成2.URL生成方式2.1根据操作名称生成URL2.2根据路由生成URL2.3在HTML中生成URL2.4在操作结果中生成URL3.区域(Area)4.实现IActi...
    99+
    2024-04-02
  • ASP.NET Core中如何使用EF创建模型
    本文小编为大家详细介绍“ASP.NET Core中如何使用EF创建模型”,内容详细,步骤清晰,细节处理妥当,希望这篇“ASP.NET Core中如何使用EF创建模型”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-06-29
  • ASP.NET Core MVC中的视图(Views)
    目录1.什么是视图2.创建视图3.控制器指定视图4.给视图传递数据1.弱类型数据2.动态视图5.更多视图特性ASP.NET Core MVC 控制器可以使用视图返回格式化的结果。 1...
    99+
    2024-04-02
  • ASP.NET Core MVC中的布局(Layout)
    目录1.什么是布局2.指定布局* 部分*忽略部分3.导入共享指令4.在每个视图之前运行代码1.什么是布局 布局通常包含常见的用户界面元素,例如应用头,导航或菜单元素和页脚,如图: ...
    99+
    2024-04-02
  • ASP.NET Core使用EF创建模型的方法
    这篇文章主要介绍“ASP.NET Core使用EF创建模型的方法”,在日常操作中,相信很多人在ASP.NET Core使用EF创建模型的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”A...
    99+
    2023-06-29
  • ASP.NET Core MVC中如何使用Tag Helper组件
    这篇文章主要介绍ASP.NET Core MVC中如何使用Tag Helper组件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Tag Helper 组件 - 简介在 ASP.NET C...
    99+
    2023-06-29
  • ASP.Net Core MVC中间件是什么
    本篇内容介绍了“ASP.Net Core MVC中间件是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!讲中间件, 其...
    99+
    2023-06-29
  • ASP.NET Core使用EF创建关系模型
    目录1.关系2.术语定义3.约定4.完全定义的关系5.无外键属性6.单个导航属性7.数据注释7.1ForeignKey7.2InverseProperty8.Fluent API8....
    99+
    2024-04-02
  • ASP.NET Core MVC中怎么实现过滤器
    本篇内容介绍了“ASP.NET Core MVC中怎么实现过滤器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!过滤器如何...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作