MVC模型绑定

视图:

 1 @model RegisterViewModel
 2 @{
 3     ViewData["Title"] = "Register";
 4 }
 5
 6 <h2>@ViewData["Title"]</h2>
 7
 8 <div class="row">
 9     <div class="col-md-4">
10         <form asp-route-returnUrl="@ViewData["ReturnUrl"]" method="post">
11             <h4>Create a new account.</h4>
12             <hr />
13             <div asp-validation-summary="All" class="text-danger"></div>
14             <div class="form-group">
15                 <label asp-for="Email"></label>
16                 <input asp-for="Email" class="form-control" />
17                 <span asp-validation-for="Email" class="text-danger"></span>
18             </div>
19             <div class="form-group">
20                 <label asp-for="Password"></label>
21                 <input asp-for="Password" class="form-control" />
22                 <span asp-validation-for="Password" class="text-danger"></span>
23             </div>
24             <div class="form-group">
25                 <label asp-for="ConfirmPassword"></label>
26                 <input asp-for="ConfirmPassword" class="form-control" />
27                 <span asp-validation-for="ConfirmPassword" class="text-danger"></span>
28             </div>
29             <button type="submit" class="btn btn-default">Register</button>
30         </form>
31     </div>
32 </div>
33
34 @section Scripts {
35     @await Html.PartialAsync("_ValidationScriptsPartial")
36 }

对应的控制器操作:

 1   [HttpPost]
 2         [AllowAnonymous]
 3         [ValidateAntiForgeryToken]
 4         public async Task<IActionResult> Register(RegisterViewModel model /*隐式模型绑定*/, string returnUrl = null)
 5         {
 6             var testModel = new TestRegisterModel();
 7             await TryUpdateModelAsync(testModel); //显示模型绑定,从请求的视图中更新当前模型对象
 8
 9             ViewData["ReturnUrl"] = returnUrl;
10             if (ModelState.IsValid)
11             {
12                 var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
13                 var result = await _userManager.CreateAsync(user, model.Password);
14                 if (result.Succeeded)
15                 {
16                     _logger.LogInformation("User created a new account with password.");
17
18                     var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
19                     var callbackUrl = Url.EmailConfirmationLink(user.Id, code, Request.Scheme);
20                     await _emailSender.SendEmailConfirmationAsync(model.Email, callbackUrl);
21
22                     await _signInManager.SignInAsync(user, isPersistent: false);
23                     _logger.LogInformation("User created a new account with password.");
24                     return RedirectToLocal(returnUrl);
25                 }
26                 AddErrors(result);
27             }
28
29             // If we got this far, something failed, redisplay form
30             return View(model);
31         }

隐式绑定参数RegisterViewModel的定义:

 1  public class RegisterViewModel
 2     {
 3         [Required]
 4         [EmailAddress]
 5         [Display(Name = "Email")]
 6         public string Email { get; set; }
 7
 8         [Required]
 9         [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)]
10         [DataType(DataType.Password)]
11         [Display(Name = "Password")]
12         public string Password { get; set; }
13
14         [DataType(DataType.Password)]
15         [Display(Name = "Confirm password")]
16         [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
17         public string ConfirmPassword { get; set; }
18     }

显式绑定参数TestRegisterModel的定义:

1 public class TestRegisterModel
2     {
3         public string Sex { get; set; }
4         public string Email { get; set; }
5     }

  • 当操作中有参数时,模型绑定会隐式的工作;如果操作中无参数,则可以使用UpdateModel()和TryUpdateModel()方法显式地调用模型绑定;
  • MVC模型绑定根据参数类型的属性(比如:ID,Title等等),会对应的在请求的视图中寻找对应的相同name属性值的控件的值,并将其传递给该参数的属性上;如果表单中不存在请求中的属性值,则参数的该属性将被自动赋值为空(NULL);

原文地址:https://www.cnblogs.com/lishidefengchen/p/8150683.html

时间: 2024-10-07 00:05:51

MVC模型绑定的相关文章

[转] ASP.NET MVC 模型绑定的功能和问题

摘要:本文将与你深入探究 ASP.NET MVC 模型绑定子系统的核心部分,展示模型绑定框架的每一层并提供扩展模型绑定逻辑以满足应用程序需求的各种方法. 同时,你还会看到一些经常被忽视的模型绑定技术,并了解如何避免一些最常见的模型绑定错误. ASP.NET MVC 模型绑定通过引入自动填充控制器操作参数的抽象层.处理通常与使用 ASP.NET 请求数据有关的普通属性映射和类型转换代码来简化控制器操作. 虽然模型绑定看起来很简单,但实际上是一个相对较复杂的框架,由许多共同创建和填充控制器操作所需对

ASP.NET MVC——模型绑定

这篇文章我们来讲讲模型绑定(Model Binding),其实在初步了解ASP.NET MVC之后,大家可能都会产生一个疑问,为什么URL片段最后会转换为例如int型或者其他类型的参数呢?这里就不得不说模型绑定了.模型绑定是指,用浏览器以HTTP请求方式发送的数据来创建.NET对象的过程.每当定义具有参数的动作方法时,一直是在依赖着这种模型绑定过程. 准备项目 我们先来创建一个MVC项目,名叫MVCModels,并在Models文件夹中创建一个新的类文件Person. 1 using Syste

MVC 模型绑定

在WebForm,获取提交表单的值一般都是Request.Form["Title"]这样的方式.在MVC中,提供了模型绑定机制.让后台获取表单或Url中的参数变得更加简单. 一.基本模型绑定 你可以直接在参数中用字符串,整型变量,实体或者是List<实体>的方式获取表单提交的参数. 参数中的这些东西都是与表单中的Html控件的name属性一一对应的. public ActionResult PersonAdd(int Id) { return View(); } 例如以上代

ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)

前面文章介绍了ASP.NET MVC中的模型绑定和验证功能,本着ASP.NET MVC没有魔法的精神,本章内容将从代码的角度对ASP.NET MVC如何完成模型的绑定和验证进行分析,已了解其原理. 本文的主要内容有: ● ModelBinder ● ValuePrivoder ● ModelMetadata ● 简单模型与复杂模型 ● 小结 ModelBinder ModelBinder是ASP. NET MVC用于模型绑定的核心组件,所有的ModelBinder都实现了IModelBinder

asp.net mvc 模型绑定太糙淡了

之前就偶尔遇到模型绑定失效的问题,一直怪自己技术渣渣 不懂人家 而已.最近又遇到 自定义类 绑定失败,看了大牛scot文档 也不得姐..&……**……&*……*…………*%%(此处一堆脏话) 干脆自己直接丰庄个扩展方法,解析request 反序列.效果倍儿好!再也不担心模型绑定失效了,参数我想怎么传就怎么穿,顺带避免了微软时间/date*****/ 的大坑 哇哈哈哈.---------------------既然别人提供的封装方法那么难使 为嘛不自己造个? 大不了一样糙蛋呗 oh yeah

ASP.NET Core MVC/WebAPi 模型绑定探索

前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用到了,你再去看理论性的文章时才会豁然开朗,这是我一直以来学习技术的方法.本文我们来讲解.NET Core中的模型绑定. 话题 在ASP.NET Core之前MVC和Web APi被分开,也就说其请求管道是独立的,而在ASP.NET Core中,WebAPi和MVC的请求管道被合并在一起,当我们建立控

ASP.NET MVC 的自定义模型绑定

最近在研究 ASP.NET MVC 模型绑定,发现 DefaultModelBinder 有一个弊端,就是无法实现对浏览器请求参数的自定义,最初的想法是想为实体模型的属性设置特性(Attribute),然后通过取得设置的特性值对属性进行赋值,研究了好久 MVC 源码之后发现可以通过重写 DefaultModelBinder 的 BindProperty 方法可以达到预期的目的. ASP.NET MVC 中有一个自定义模型绑定特性 CustomModelBinderAttribute,打算通过重写

【转】ASP.NET Core MVC/WebAPi 模型绑定探索

前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用到了,你再去看理论性的文章时才会豁然开朗,这是我一直以来学习技术的方法.本文我们来讲解.NET Core中的模型绑定. 话题 在ASP.NET Core之前MVC和Web APi被分开,也就说其请求管道是独立的,而在ASP.NET Core中,WebAPi和MVC的请求管道被合并在一起,当我们建立控

net core 模型绑定与之前版本的不同

之前有一个用于七牛上传图片的Callback Url的WebAPI (之前是用.net4.0,运行正常) 代码如下: // 七牛CallBack地址,CallbackBody内容name=upload/member/1.jpg&hash=Fn6qeQi4VDLQ347NiRm-RlQx_4O2 public object Post([FromBody]dynamic data) { ILog logger = LogManager.GetLogger(System.Reflection.Meth