asp.net core mvc之模型绑定、特性约束模型绑定、模型验证(服务器/客户端/远程)

一、不用模型绑定

数据类型都是string

1、UserController.cs

cs 复制代码
public class UserController : Controller
{
    public IActionResult Register()
    {
         return View();
    }

    [HttpPost]
    public IActionResult DoRegister()
    {
          //不用模型绑定  以前的方法取表单数据或Url的参数
          //数据类型都是string
          string s1 = HttpContext.Request.Form["name"];
          string s2 = HttpContext.Request.Query["id"];
          return View();
    }
}

2、Register.cshtml

cs 复制代码
@{
    ViewData["Title"] = "注册";
}

<form method="post" action="/User/DoRegister?id=22">
    <input type="text" name="name" placeholder="请输入用户名"/><br/>
    <input type="password" name="password" placeholder="请输入密码"/><br/>
    <input type="password" name="comfirmpassword" placeholder="请输入确认密码"/><br/>
    <input type="submit" value="提交" />
</form>

二、简单数据类型绑定

可以指定数据类型,比如id 我们可以指定int

表单数据的name 一定要和参数的名称一致

public IActionResult DoRegister(string name,string password,string comfirmpassword,int id)

三、复杂数据类型绑定

把数据绑定到一个实体类型的属性

1、创建UserInfo实体

cs 复制代码
    public class UserInfo
    {
        private int id;
        private string name;
        private string password;
        private string comfirmpassword;

        public int Id { get => id; set => id = value; }
        public string Name { get => name; set => name = value; }
        public string Password { get => password; set => password = value; }
        public string Comfirmpassword { get => comfirmpassword; set => comfirmpassword = value; }
    }

2、UserController.cs控制器修改

cs 复制代码
 public IActionResult DoRegister(UserInfo userInfo)

四、特性约束模型绑定

1、UserInfo.cs 模型

cs 复制代码
//增加这个标注 则这个属性不会被绑定
[BindNever] 
public int Id { get => id; set => id = value; }

//增加这个标注 则这个属性必须被绑定,如果没绑定 控制器中 ModelState.IsValid==false
//将 用户名输入框注释,可测试这个标注
[BindRequired]
public string Name { get => name; set => name = value; }

2、Register.cshtml 视图,将 用户名 输入框注释掉

3、UserController.cs 控制器

cs 复制代码
        public IActionResult DoRegister(UserInfo userInfo)
        {

            if (ModelState.IsValid==false)
            {
                string message=ModelState.Root.Children[0].Errors[0].ErrorMessage;
            }

            return View();
        }

五、模型验证 - 服务器端

模型 UserInfo.cs

cs 复制代码
[StringLength(maximumLength:15,MinimumLength =6)]//字符最小长度6,最大长度15
public string Name { get => name; set => name = value; }

[Required] //必填
public string Password { get => password; set => password = value; }

[Compare("Password")] //比较验证
public string Comfirmpassword { get => comfirmpassword; set => comfirmpassword = value; }

其他验证

Required;必填的属性。

Compare:验证模型中的两个性是否匹配

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

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

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

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

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

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

六、模型验证 - 客户端

客户端验证是通过js挡住普通用户,危险用户可以能会把js去掉。所以客户端验证是不安全的。

客户端验证可以减轻服务器端的压力。

1、在 Register.cshtml 视图中,添加 js文件。js导入顺序不能颠倒

2、在 Register.cshtml 视图,指定强视图

cs 复制代码
@model FirstCoreMvc.Models.UserInfo

3、在 Register.cshtml 视图,使用 bootstrap框架 ,完整代码如下:

cs 复制代码
@model FirstCoreMvc.Models.UserInfo
@*指明视图使用那一个实体*@

<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>

<form method="post" action="/User/DoRegister?id=22">
    @* 先学习bootstrap框架 *@
    <div class="form-group">
        <label asp-for="Name" class="col-md-2 control-label"></label>
        <div class="col-md-10">
            <input asp-for="Name" class="form-control" />
            <span asp-validation-for="Name" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <label asp-for="Password" class="col-md-2 control-label"></label>
        <div class="col-md-10">
            <input asp-for="Password" class="form-control" />
            <span asp-validation-for="Password" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <label asp-for="Comfirmpassword" class="col-md-2 control-label"></label>
        <div class="col-md-10">
            <input asp-for="Comfirmpassword" class="form-control" />
            <span asp-validation-for="Comfirmpassword" class="text-danger"></span>
        </div>
    </div>
    <input type="submit" value="提交" />
</form>

4、UserInfo.cs 模型

cs 复制代码
[Required(ErrorMessage = "用户名必填")] //必填
[StringLength(maximumLength: 15, MinimumLength = 6,ErrorMessage ="用户名长度必须6-15字符")]
[Display(Name = "用户名")]
public string Name { get => name; set => name = value; }

[Required(ErrorMessage ="密码必填")] //必填
[Display(Name = "密码")]
public string Password { get => password; set => password = value; }

[Compare("Password", ErrorMessage ="{0}和{1}必须一样")] //比较验证
[Display(Name = "确认密码")]
public string Comfirmpassword { get => comfirmpassword; set => comfirmpassword = value; }

效果:

七、远程验证

有些验证需要用到数据库里的数据。如:验证用户名是否已经注册了。

1、UserInfo.cs 模型

在Name属性添加 Remote("方法","控制器") 标注

cs 复制代码
[Remote("VerifyName","User")]
public string Name { get => name; set => name = value; }

2、UserController 控制器添加 VerifyName 方法

cs 复制代码
public IActionResult VerifyName(string name)
{
      if (name == "aaaaaa")
      {
         return Json(data: $"{name}已经被注册");
      }
      else
      {
         return Json(data: true);
      }
}
相关推荐
烂蜻蜓1 小时前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
2601_962055978 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
Lost of 程序猿9 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
QQ_216962909610 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
郑州光合科技余经理12 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
IT_陈寒12 小时前
Vue的嵌套组件竟然吃掉了我的事件?
前端·人工智能·后端
大辉狼_音频架构13 小时前
进阶:从源码编译 SOF 固件与 topology
后端
大辉狼_音频架构13 小时前
上板:让 SOF 在 FRDM-i.MX8MP 上跑起来
后端
大辉狼_音频架构13 小时前
FRDM-IMX8MP UUU 烧录 eMMC 指南
后端
运行时异常14 小时前
【WMS 仓储系统集成 AI Agent 实战】第 3 讲:Spring Security 6 + JWT——addFilterBefore 一词之差,全站 401
java·后端