mvc基础系列说谈(5)——参数与值传递,提交数据
準備工作:
現在添加Customer控制器,同時,在創建控制器的時候,添加Create,Delete,Detail動作。
Customer的模型結構為:
Customer類:CustomerID,LastName,FirstName
現在控制器情況為:?
代碼 public?class?CustomerController?:?Controller{
????????public?ActionResult?Index()
????????{
????????????return?View();
????????}
????????public?ActionResult?Details(int?id)
????????{
????????????return?View();
????????}
????????public?ActionResult?Create()
????????{
????????????return?View();
????????}?
????????[AcceptVerbs(HttpVerbs.Post)]
????????public?ActionResult?Create(FormCollection?collection)
????????{
????????????try
????????????{
?????????????????return?RedirectToAction("Index");
????????????}
????????????catch
????????????{
????????????????return?View();
????????????}
????????}
????????public?ActionResult?Edit(int?id)
????????{
????????????return?View();
????????}
????????[AcceptVerbs(HttpVerbs.Post)]
????????public?ActionResult?Edit(int?id,?FormCollection?collection)
????????{
????????????try
????????????{
????????????????return?RedirectToAction("Index");
????????????}
????????????catch
????????????{
????????????????return?View();
????????????}
????????}
}
?
可以看到,除Index,Details動作外,其它的CU全是兩個動作,由于修飾標簽的作用而在不同情況下調用動作來返回視圖。
(一)添加列表
在Views中添加Customer文件夾,然后在此文件夾中添加Index視圖。并指定強類型Customer,并指定自動生成視圖內容:List
代碼就不貼了。然后在動作中為視圖指定model
public?ActionResult?Index(){
????IList<Customer>?_list?=?dd.ShowList();
????return?View(_list);
}
?
Index
Create New ? |
現在點擊第一條的詳細,會發生什么事:
<%=?Html.ActionLink("詳細",?"Details",?new?{?/*?id=item.PrimaryKey?*/?})%>?
通過ActionLink來重定向到控制器下的Details動作。
public?ActionResult?Details(int?id){
??return?View();
}
?
這個動作接受一個參數,但在列表中沒有提供參數:
| The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Details(Int32)' in 'Web.Controllers.CustomerController'. To make a parameter optional its type should be either a reference type or a Nullable type. 參數名: parameters |
因為在Details方法(動作)動作中要求有一個int型參數,但在傳遞時傳遞的是一個Null值,解決:
1 為Details方法的參數改為可空整形
2 傳遞參數
現在為Details動作添加視圖,Details。這個就不說了。然后再點詳細:
會提示:未將對象引用設置到對象的實例。這是因為還沒有為詳細視圖返回model實例。現在在Details方法(動作)中,添加:
public?ActionResult?Details(int??id){
???Customer?customer?=?new?Customer();
???if?(id.HasValue)
???????customer?=?dd.GetCustomer((int)id);
???return?View(customer);
}
?
現在再點詳細看看,會發現,可以預覽,但沒有值,這個很容易理解,傳遞的值為Null,所以int? id就為空,所以返回的是一個空實例(只有實例的默認值)。這時候可以為其指定一個路由默認值:
?
new { controller = "News", action = "NewsList", id = "2" },它取的的是id=2這個默認值
?
接下來為詳細傳遞id參數,即在列表視圖中為詳細鏈接添加參數:
<%= Html.ActionLink("詳細", "Details", new { id=item.CustomerId })%>
其中id部分與Details動作的參數名相同。現在的詳細就可以正常了。
| Index
? ? Details
CustomerId: 3 FirstName: Tom ? |
?
(二)創建Create視圖
在創建過程中,選擇強類型,并選擇Customer實體。
然后Create視圖的代碼就不貼了。簡單的說明一下:
·驗證控件,每個創建的輸入文本框都有相應的ValidationMessage
·Form,添加了表單,但沒有指定動作類型,所以這里默認的是Post
??? Post:表單在提交時,填寫在表單中的數據將在底層發送到action=“url”中的url去
??? Get:表單在提交時,填寫在表單中的數據會和action=“url”中的url編碼在一起
·輸入框,這個會依賴此頁的強類型Model而對應生成。
Inherits="System.Web.Mvc.ViewPage<Web.Models.Customer>"
然后看控制器中,可以看到有兩個動作:
public?ActionResult?Create(){
????return?View();
}?
[AcceptVerbs(HttpVerbs.Post)]
public?ActionResult?Create(FormCollection?collection)
{
????try
????{
???????return?RedirectToAction("Index");
????}
????catch
????{
???????return?View();
????}
}
?
第一個沒有參數,返回空視圖,它就是為導航到Create頁。且默認Method為get
第二個用于處理創建工作,它的Method被標簽修飾為Post,它只接受post動作。
還以列表頁Index為例,當點擊
<%= Html.ActionLink("Create New", "Create") %>時,會get到Create動作。這時執行第一個動作,返回空視圖(其實這個視圖與返回一個沒有值的model一樣)
然后在創建時,提交表單,會提交到Create動作,這個時候接愛的謂詞為Post:[AcceptVerbs(HttpVerbs.Post)]
所以,在這個動作中做數據添加操作。
(1)參數為FormCollection collection
這個表單集合包含了post過來的表單元素。
[AcceptVerbs(HttpVerbs.Post)]public?ActionResult?Create(FormCollection?collection)
{
????try
????{
???????Customer?customer?=?new?Customer?
???????{?
???????????FirstName?=?collection["FirstName"],
???????????LastName=collection["LastName"]?
???????};
???????dd.Add(customer);
???????return?RedirectToAction("Index");
????}
????catch
????{
???????return?View();
????}
}
?
(2)參數為持久實體
[AcceptVerbs(HttpVerbs.Post)]public?ActionResult?Create(Customer?customer)
{
????try
????{
????????dd.Add(customer);
????????return?RedirectToAction("Index");
????}
????catch
????{
????????return?View();
????}
}
?
這個比較方便。
(3)通過Form方法得到參數。
string?strFirstName?=?Request.Form["FirstName"].ToString();string?strLastName?=?Request.Form["LastName"].ToString();
?
這個與FormCollection 相同
?
Index
Create New ? |
?
(三)刪除與編輯與上面的同理
例如:刪除可以get方式傳遞一個id值
(四)文件上傳
如果有文件上傳時,要把Form的
enctype="multipart/form-data"
屬性設置一下。
| HTML enctype 屬性 enctype 屬性 -- 代表HTML表單數據的編碼方式 application/x-www-form-urlencoded:窗體數據被編碼為名稱/值對.這是標準的編碼格式. multipart/form-data:窗體數據被編碼為一條消息,頁上的每個控件對應消息中的一個部分. text/plain:窗體數據以純文本形式進行編碼,其中不含任何控件或格式字符. |
Form的這個屬性的默認值是:application/x-www-form-urlencoded
在http頭中可以看到:Content-Type:application/x-www-form-urlencoded
?
<input type="file" name="upfile1" />
注意:上傳控件的name屬性一定要設置,否則提交附件無效!
(1)以默認方式提交文本
FirstName:
LastName:
提交創建:
發送的數據是:
FirstName:松
LastName:武
(2)以默認方式提交上傳文件
現在發現,上傳文件不能提交到服務器。
查看提交的內容,可以看到:
FirstName=q1&LastName=q2
兩個文本屬性以kv對傳到服務器,而附件:
upfile1=C:\Documents and Settings\Administrator\妗岄潰\Image76.gif
只有一個地址而已
(3) 改用multipart/form-data
這個時候,在http頭及提交的數據流里可以看到:
?
| Content-Type:multipart/form-data; boundary=---------------------------7daf1ec01dc ? -----------------------------7daf1ec01dc Content-Disposition: form-data; name="FirstName" ? x -----------------------------7daf1ec01dc Content-Disposition: form-data; name="LastName" X Content-Disposition: form-data; name="upfile1"; filename="C:\Documents and Settings\Administrator\妗岄潰\Image76.gif" Content-Type: image/gif 二進制 ? |
以上貼出部分內容。
現在,全部的值都可以得到了。
?
[AcceptVerbs(HttpVerbs.Post)]public?ActionResult?Create(FormCollection?collection)
{
????try
????{
???????Customer?customer?=?new?Customer?
???????{?
??????????FirstName?=?collection["FirstName"],?
??????????LastName?=?collection["LastName"]?
???????};
???????dd.Add(customer);?
???????if?(Request.Files.Count?>?0)
???????{
???????????Request.Files[0].SaveAs(Server.MapPath("../uploadlist/xx.gif"));
???????}
???????return?RedirectToAction("Index");
????}
????catch
????{
???????return?View();
????}
}
?
?
?轉載于:https://www.cnblogs.com/jams742003/archive/2010/02/08/1665773.html
總結
以上是生活随笔為你收集整理的mvc基础系列说谈(5)——参数与值传递,提交数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel单元格下拉菜单
- 下一篇: C# winform DataGridV