準備工作:
現在添加Customer控制器,同時,在建立控制器的時候,添加Create,Delete,Detail動作。
Customer的模型結構為:
Customer類:CustomerID,LastName,FirstName
現在控制器情況為:

代碼
public class CustomerController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Details(int id)
public ActionResult Create()
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
try
{
return RedirectToAction("Index");
}
catch
return View();
public ActionResult Edit(int id)
public ActionResult Edit(int id, FormCollection collection)
return RedirectToAction("Index");
}
可以看到,除Index,Details動作外,其它的CU全是兩個動作,由于修飾标簽的作用而在不同情況下調用動作來傳回視圖。
(一)添加清單
在Views中添加Customer檔案夾,然後在此檔案夾中添加Index視圖。并指定強類型Customer,并指定自動生成視圖内容:List
代碼就不貼了。然後在動作中為視圖指定model
public ActionResult Index()
IList<Customer> _list = dd.ShowList();
return View(_list);
CustomerId
FirstName
LastName
3
Tom
2
Song
<a href="http://localhost:8148/Customer/Create" target="_blank">Create New</a>
現在點選第一條的詳細,會發生什麼事:
<%= 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過來的表單元素。
Customer customer = new Customer
{
FirstName = collection["FirstName"],
LastName=collection["LastName"]
};
dd.Add(customer);
(2)參數為持久實體
public ActionResult Create(Customer customer)
dd.Add(customer);
return RedirectToAction("Index");
return View();
這個比較友善。
(3)通過Form方法得到參數。
string strFirstName = Request.Form["FirstName"].ToString();
string strLastName = Request.Form["LastName"].ToString();
這個與FormCollection 相同
4
江
宋
5
用
吳
6
要
在
(三)删除與編輯與上面的同理
例如:删除可以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
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
二進制
以上貼出部分内容。
現在,全部的值都可以得到了。
FirstName = collection["FirstName"],
LastName = collection["LastName"]
dd.Add(customer);
if (Request.Files.Count > 0)
{
Request.Files[0].SaveAs(Server.MapPath("../uploadlist/xx.gif"));
}
部落格園大道至簡
<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>
轉載請注明:部落格園