上次分享了控制器向視圖傳遞數據的4種方式,今天再來給大家講講MVC視圖中的數據如何提交到控制器。 我們可以通過以下幾種方式提交數據到控制器: 1、通過Request.Form讀取表單數據 在 控制器動作方法(Action)中,POST方法提交的表單可以使用Request.Form讀取其中的數據: < ...
上次分享了控制器向視圖傳遞數據的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)原文鏈接