控制器读取视图表单中的数据的几种方式

上次分享了控制器向视图传递数据的4种方式,今天再来给大家讲讲MVC视图中的数据如何提交到控制器。

我们可以通过以下几种方式提交数据到控制器:

 

1、通过Request.Form读取表单数据

在 控制器动作方法(Action)中,POST方法提交的表单可以使用Request.Form读取其中的数据:

<html>

<head></head>

<body>

<form>

<input type="text" name="Name" value="代码里"/>

<input type="text" name="Site" value="http://www.daimali.com"/>

<input type="submit" value="提交数据"/>

</form>

</body>

</html>

在控制器的Action中获取数据:

public ActionResult  Create()

{

string Name=Request.Form["Name"].ToString();

string Site = Request.Form["Site"].ToString();

}

如上,我们实现了数据从视图到控制器的传递,但在ASP.NET MVC中,ASP.NET MVC框架已经提供了DefaultModelBinder类,可以简化表单数据的读取,所以通过Request.Form读取表单数据的方法并不是最好的方式。下面我们再来看看第二种。

 

2. 通过FormCollection读取表单数据

我们可以通过传入的FormCollection集合读取表单数据。

public ActionResult  Create(FormCollection collection)

{

string Name=collection["Name"];

string Site = collection["Site"];

}

 

3. 通过Model Binder读取表单数据

模型绑定(Model Binder) 是将浏览器请求的数据映射到模型对象的过程。

<html>

<head></head>

<body>

<form>

商品名称:<input type="text" name="Name" value="电脑"/>

单价:<input type="text" name="Price" value="5200"/>

<input type="submit" value="提交数据"/>

</form>

</body>

</html>

在控制器的Action中获取数据:

public ActionResult  Create(Product product)

{

string Name=product.Name;

float Price =product.Price;

}

当 用户提交表单到控制器动作方法中时,将在动作方法中接受一个商品对象作为参数,默认模型绑定会创建商品对象并将HTML表单的字段值赋给该对象属性。

模型绑定支持类型:简单类型,自定义类,数组,集合,字典

我们来看看集合的绑定:

<html>

<head></head>

<body>

<form>

<input type="checkbox" name="source" value="代码里"/>

<input type="checkbox" name="source" value="百度"/>

<input type="checkbox" name="source" value="腾讯"/>

<input type="submit" value="提交数据"/>

</form>

</body>

</html>

视图中包含了一个复选框列表,复选框具有相同的名称,在控制器的Action中获取数据:

public ActionResult  GetCheckBoxList(List<string> source)

{

//多选的值自动转换为字符串集合存储在source集合中,可以通过循环获取单个的值

string message=string.Empty;

foreach(string msg in source)

{

message+=msg;

}

.....

}

 

绑定复杂类

默认模型绑定能够自动绑定大多数复杂类对象

public class Customer

{

public int ID{get;set;}

public string Name{get;set;}

public Address Address{get;set;}

}

public class Address

{

public string City{get;set;}

public string Country{get;set;}

}

Customer类包含一个返回Address类实例的Address属性

视图表单:

<html>

<head></head>

<body>

<form>

<span>客户信息</span>

名称:<input type="text" name="Name" value="代码里"/>

 

<span>客户地址:</span>

城市:<input type="text" name="Address.City" value="上海"/>

国家:<input type="text" name="Address.Country" value="中国"/>

 

<input type="submit" value="提交数据"/>

</form>

</body>

</html>

注意:地址表单中都有Address前缀声明

public ActionResult  Create(Customer customer)

{

string name=customer.Name;

string city=customer.Address.City;

string Country=customer.Address.Country;

}

视图中包含创建新客户的HTML表单,该表单中包含客户表单和客户地址表单两个子表单,地址表单的字段都有Address前缀声明。列如:City属性对应表单字段的Address.City,模型绑定时,自动将表单City字段的值设置到Address.City属性种。

 

相关特性使用:

当然我们在实际使用中可能不需要绑定所有的对象属性,我们可以通过Exclude和Include来实现排除和指定绑定的属性:

Exclude: 排查绑定的属性列表,列表以逗号隔开

Include:可以绑定的属性列表,列表以逗号隔开

 

列如,不需要绑定ID属性时:

public ActionResult  Create([Bind(Exclude="ID")]Customer customer)

{

string name=customer.Name;

string city=customer.Address.City;

string Country=customer.Address.Country;

}

当然我们也可以在类中使用绑定特性:

[Bind(Exclude="ID")]

public class Customer

{

public int ID{get;set;}

public string Name{get;set;}

}

 

总结:

1.Model传值: 文本框的name属性值要和model实体的属性名一一匹配,控制器中可以使用实体类的方式接收参数

2.Request.Form获取Post方式提交的数据

3.FormConnection集合传值

 

原文:代码里(www.daimali.com)原文链接

 

posted @ 2016-06-02 10:59  李伟-CodeL  阅读(5438)  评论(0编辑  收藏  举报