MVC 手写模型绑定

使用情景介绍:

首先我们在项目中创建一个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();
        }
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值