使用情景介绍:
首先我们在项目中创建一个Person实体类
namespace MvcApp.Models
{
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
}
创建一个HomeController控制器,然后我们添加一个Index视图。
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>模型绑定测试</title>
</head>
<body>
<form action="/Home/PostData" method="post">
<div>
编号 <input type="text" name="w_id" />
姓名 <input type="text" name="w_name" />
年龄 <input type="text" name="w_age" />
<input type="submit" value="提交" />
</div>
</form>
</body>
</html>
在HomeController下面创建一个PostData方法,在这个方法中我们想用一个Person类来接收从视图传过来的表单数据
namespace MvcApp.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult PostData(Person per)
{
return View();
}
}
}
我们发现这个per对象并不能接收从Index视图页面传递过来的表单数据(当然如果你将per对象中的属性名称改成与视图提交过来的表单name属性一致那也是可以接收到从视图表单传递过来的数据的。当时那也是Mvc默认帮我们实现了的模型板顶。现在我们就开始说人工实现模型绑定)
那这个绑定具体是绑定什么呢?其实就是将从Index视图中的表单元素绑定到我们自定义的Person类对象中。我们使用它的时候只要将参数上打一个[ModelBinder(typeof(PersonBinder))] 特性就行了。(其实我们可以在类,方法,属性上面打上一个特性,同时我们也是可以在参数上面打上特性的)
例如:public ActionResult PostData([ModelBinder(typeof(PersonBinder))] Person per) 这就是给参数per打上了一个[ModelBinder(typeof(PersonBinder))]特性标签
----------------------------》好了我们进入正题
实现模型绑定需要实现IModelBinder接口
下面我们来创建一个PersonBinder.cs类。然后让这个类继承IModelBinder接口。在这个类中我们来实现模型绑定
namespace MvcApp.Common
{
public class PersonBinder:IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var request = controllerContext.HttpContext.Request; //获取请求的上下文
Person p = new Person();
//--------这里的意思其实就是将从视图传递过来的表单数据绑定到 Person类的一个p对象上
p.Id = int.Parse(request["w_id"]); //将前台页面传递过来的 id="w_id" 的表单元素的值绑定到Person类对象的Id属性上
p.Name = request["w_name"]; //将前台页面传递过来的 id="w_name" 的表单元素的值绑定到Person类对象的Name属性上
p.Age = int.Parse(request["w_age"]); //将前台页面传递过来的 id="w_age" 的表单元素的值绑定到Person类对象的Age属性上
return p;
}
}
}
以上就实现了将视图表单绑定到Person类对象中了
那现在我们就在HomeController中类使用它
namespace MvcApp.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
//给参数per 前面打一个[ModelBinder(typeof(PersonBinder))]特性标签。那么当点击视图的提交按钮的时候,将表单元数据提交到PostData()方法前,会先执行PersonBinder.cs类中的BindModel方法。在这个BindModel方法中就将视图中的表单数据的值赋值给Person了(即:将表单元素绑定到了Person对象上) 然后再进入PostData()方法,此时PostData([ModelBinder(typeof(PersonBinder))] Person per)方法中的per对象已经有值了。
public ActionResult PostData([ModelBinder(typeof(PersonBinder))] Person per) //此时per里的属性已经绑定了各个表单元素的值了。
{
ViewBag.per = per;
return View();
}
}
}