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

发布时间:2017-09-11 11:18:20
ASP.NET MVC学习之模型绑定(1) 一、前言

下面我们将开始学习模型绑定,通过下面的知识我们将能够理解ASP.NET MVC模型的模型绑定器是如何将http请求中的数据转换成模型的,其中我们重点讲述的是表单数据。

二、正文1.简单类型绑定

学过一定ASP.NET MVC都会为这个特点所骄傲,就是能够将表单中与同名的参数映射,这相比操作ASP.NET控件来获取值轻便了许多,但是正如上面所说的那样要同名(大小写不区分),下面我们会讲述如何自己去指定。

首先我们在HomeController(如果不存在则创建)中获取表单中的值并显示:

复制代码

1 namespace MvcStudy.Controllers

2 {

3 public class HomeController : Controller

4 {

5 public ActionResult Index()

6 {

7 return View();

8 }

9

10 [HttpPost]

11 public ActionResult Index(String person)

12 {

13 TempData["msg"] = person ?? "";

14 return View();

15 }

16 }

17 }

复制代码

接着我们在Views/Home/Index.cshtml中写入如下代码:

复制代码

1 @{

2 ViewBag.Title = "Index";

3 }

4

5 @using (Html.BeginForm())

6 {

7 <input type="text" name="perSon" />

8 <input type="submit" value="submit" />

9 }

10

11 @if (TempData.ContainsKey("msg"))

12 {

13 <p>

14 @TempData["msg"].ToString()

15 </p>

16 }

复制代码

这里我们有一个name为perSon的输入框,下面我们在提交后还输出了这个值。下面读者可以尝试输入一个值,可以看到下面会对应的输出。但是这个时候我们将name为perSon的输入框改成persons就不会显示了。理由很简单,因为名称不同了,但是通过Bind注解属性可以解决这个问题,下面我们打开HomeController并修改代码:

1 [HttpPost]

2 public ActionResult Index([Bind(Prefix="persons")]String person)

3 {

4 TempData["msg"] = person ?? "";

5 return View();

6 }

这里我们通过Bind的Prefix修改了person的前缀,然后重新编译,我们可以发现又显示了。这样以后我们并不需要名称都一样了。

上面介绍的只是对于一个简单类型的情况,当然多的可以以此类推,但如果是数组呢?得益于ASP.NET MVC的默认模型绑定我们只要重复同一个name多次,就可以简单的形成了数组了比如我们将Index.cshtml改成如下代码:

复制代码

1 @using (Html.BeginForm())

2 {

3 <input type="text" name="persons" />

4 <input type="text" name="persons" />

5 <input type="text" name="persons" />

6 <input type="text" name="persons" />

7 <input type="text" name="persons" />

8 <input type="text" name="persons" />

9 <input type="submit" value="submit" />

10 }

11

12 @if (TempData.ContainsKey("msg"))

13 {

14 <p>

15 @TempData["msg"].ToString()

16 </p>

17 }

复制代码

作为演示我们只是简单的将输入框复制了几遍,下面我们修改HomeController的代码:

1 [HttpPost]

2 public ActionResult Index([Bind(Prefix="persons")]IList<String> person)

3 {

4 TempData["msg"] = String.Join(";", person);

5 return View();

6 }

通过上面代码我们可以看到即使是数组一样也是可以使用Bind注解属性的,同时类型也改成了IList<String>,下面我们通过String的Join方法将这个数组拼接成一个数组,中间以分号分割。读者这个时候可以重新编译然后尝试,最后的效果如下所示:

2.复合类型绑定

很多实际的情况我们都会使用一个复合类型取代多个简单类型,那么问题就来了,ASP.NET MVC是如何绑定呢?对于一个复合类型,还是会按照名称映射到复合属性中对应的属性,但是好奇的人一定会使用Bind注解属性,想看看会发生什么事情,那么我们下面就 模拟一下,首先我们新建一个简单的Person类:

复制代码

1 namespace MvcStudy.Models

2 {

3 public class Person

4 {

5 public String FirstName { get; set; }

6 public String LastName { get; set; }

7 public Address HomeAddress { get; set; }

8 }

9 }

复制代码

还有一个Address类(后面需要使用):

复制代码

1 namespace MvcStudy.Models

2 {

3 public class Address

4 {

5 public String Line1 { get; set; }

6 public String Line2 { get; set; }

7 }

8 }

复制代码

接着我们修改Index.cshtml将其中的表单的输入框于Person对应起来:

复制代码

1 @using (Html.BeginForm())

2 {

3 <input type="text" name="FirstName" />

4 <input type="text" name="LastName" />

5 <input type="submit" value="submit" />

6 }

7

8 @if (TempData.ContainsKey("msg"))

9 {

10 <p>

11 @TempData["msg"].ToString()

12 </p>

13 }

复制代码

与之对应的还要修改HomeController中的代码:

复制代码

1 namespace MvcStudy.Controllers

2 {

3 public class HomeController : Controller

4 {

5 public ActionResult Index()

6 {

7 return View();

8 }

9

10 [HttpPost]

11 public ActionResult Index(Person person)

12 {

13 TempData["msg"] = person.FirstName + person.LastName;

14 return View();

15 }

16 }

17 }

复制代码

我们先不使用Bind注解属性,可以发现最后的输出是正确的,然后我们加上Bind注解属性:

1 [HttpPost]

2 public ActionResult Index([Bind(Prefix="p")]Person person)

3 {

4 TempData["msg"] = person.FirstName + person.LastName;

5 return View();

6 }

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网站设计公司 https://www.feimao666.com