控制器讀取視圖表單中的數據的幾種方式


上次分享了控制器向視圖傳遞數據的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)原文鏈接

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM