asp.net mvc 中的模型绑定

在asp.net MVC 应用程序, 表单提交的数据通过模型绑定将数据从View传递到控制器中。使用模型绑定显然比Request.Form["Price"] ,Decimal.Parse(Request.Form["Price"] )还需要手动类型转换要要方便很多。

模型绑定有两种,隐式绑定和显式绑定。

1、隐式模型绑定。先将表单值转化为CLR 类型,然后以表单字段name名称,value值参数传递到Action中。为了防止过度提交,使用Bind(Include)属性接受白名单,Bind(Exclude="")属性拒绝黑名单。

// POST: Movie/Create
// 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关
// 详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=317598。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
if (ModelState.IsValid)
{
db.Movies.Add(movie);  //将实体的跟踪状态设置为 EntityState.Added;如果是在编辑操作中, 需要手动设置 EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}

return View(movie);
}

2、显式绑定  使用TryUpdateModel 和UpdateModel 显式绑定,它自动将数据库上下文对象的跟踪的实体状态设置为EnrityState.Modified。还可以通过设定参数来指定绑定的字段,两者的区别 是如果 绑定失败,前者不会抛出一个异常,后者会引发异常。

[HttpPost]
[ActionName("Edit")]
[ValidateAntiForgeryToken]
public ActionResult EditPost(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}

var studentToUpdate = db.Students.Find(id);
if (TryUpdateModel(studentToUpdate, "", new string[] { "LastName", "FirstMidName", "EnrollmentDate" }))
{
try
{
//已不需要下面的语句,来设置数据库上下文跟踪实体的状态了,已自动设置跟踪状态的EntityState.Modified标记
// db.Entry(studentToUpdate).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
catch(DataException /* dex*/)
{
//Log the error (uncomment dex variable name and add a line here to write a log.
ModelState.AddModelError("", "不能保存更改,重试一次,如果问题仍然存在,请与系统管理员联系");
}
}

return View(studentToUpdate);

}

时间: 2024-10-12 17:49:24

asp.net mvc 中的模型绑定的相关文章

ASP.NET MVC学习之模型绑定(1)

一.前言 下面我们将开始学习模型绑定,通过下面的知识我们将能够理解ASP.NET MVC模型的模型绑定器是如何将http请求中的数据转换成模型的,其中我们重点讲述的是表单数据. 二.正文 1.简单类型绑定 学过一定ASP.NET MVC都会为这个特点所骄傲,就是能够将表单中与同名的参数映射,这相比操作ASP.NET控件来获取值轻便了许多,但是正如上面所说的那样要同名(大小写不区分),下面我们会讲述如何自己去指定. 首先我们在HomeController(如果不存在则创建)中获取表单中的值并显示:

ASP.NET MVC中的模型装配 封装方法 非常好用

我们知道在asp.net mvc中 视图可以绑定一个实体模型 然后我们三层架构中也有一个model模型 但是这两个很多时候却是不一样的对象来的 就拿微软的官方mvc例子来说明 微软的视图实体中 有loginmodel 有registermodel 等等 这些视图模型 都只是占用户实体的某几个字段而已, 那么这个时候 我们可以用下面两个方法来转换 自动赋值两个对象的 protected T AssembleInfo<T, T2>(T2 model)        {            Pro

ASP.NET MVC 4 (九) 模型绑定

模型绑定指的是MVC从浏览器发送的HTTP请求中为我们创建.NET对象,在HTTP请求和C#间起着桥梁的作用.模型绑定的一个最简单的例子是带参数的控制器action方法,比如我们注册这样的路径映射: routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Inde

[转]ASP.NET MVC 4 (九) 模型绑定

本文转自:http://www.cnblogs.com/duanshuiliu/p/3706701.html 模型绑定指的是MVC从浏览器发送的HTTP请求中为我们创建.NET对象,在HTTP请求和C#间起着桥梁的作用.模型绑定的一个最简单的例子是带参数的控制器action方法,比如我们注册这样的路径映射: routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: n

ASP.NET MVC学习之模型绑定(2)

3.手工调用模型绑定 很多情况下我们都是通过形参的方式接收来自http流中的数据,这看似是完美的,但是缺少了很多过程中的控制,所以我们就需要使用手工的方式进行绑定.下面我们通过一个例子来说明,首先打开Views/Home/Index.cshtml页面,并输入如下代码: 1 @{ 2 ViewBag.Title = "Index"; 3 } 4 5 @if (TempData.ContainsKey("msg")) 6 { 7 <h1> 8 @TempDa

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

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

.Net Core MVC中的模型绑定、验证以及ModelState.IsValid的使用

Require就是说这个属性不能为空,EmailAddress就是说这个属性值必须符合一个Email地址格式. [Required(ErrorMessage ="尚有未填写项,请先完善")]        public string Name { get; set; }        [Required(ErrorMessage = "尚有未填写项,请先完善")]        [EmailAddress(ErrorMessage ="邮箱格式错误&quo

Spring MVC系列之模型绑定(SpringBoot)(七)

前言 上一节我们在SpringBoot中启用了Spring MVC最终输出了HelloWorld,本节我们来讲讲Spring MVC中的模型绑定,这个名称来源于.NET或.NET Core,不知是否恰当,我们暂且这样理解吧. @RequestParam VS  @PathVariable 一看注解名称应该非常好理解,注解@RequestParam主要用来获取查询字符串参数,而注解@PathVaruable用于获取路由参数,下面我们来看如下一个例子: @ResponseBody @RequestM

Asp.Net MVC在过滤器中使用模型绑定

废话不多话,直接上代码 1.创建MVC项目,新建一个过滤器类以及使用到的实体类: 1 public class DemoFiltersAttribute : AuthorizeAttribute 2 { 3 public override void OnAuthorization(AuthorizationContext filterContext) 4 { 5 var person = new Person(); 6 //过滤器中使用模型绑定 7 BindModel<Person>(filt