實現HTTP-POST的Edit Action方法
1. [AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues) {}
表示該方法負責處理HTTP POST動作。
2. 擷取表單提交的值
一個簡單的辦法是使用Controller基類的Request屬性來訪問form集合,並直接擷取提交的參數值:
public ActionResult Edit(int id, FormCollection formValues)
{
// Retrieve existing dinner
Dinner dinner = dinnerRepository.GetDinner(id);
// Update dinner with form posted values
dinner.Title = Request.Form["Title"];
dinner.Description = Request.Form["Description"];
dinner.EventDate = DateTime.Parse(Request.Form["EventDate"]);
dinner.Address = Request.Form["Address"];
dinner.Country = Request.Form["Country"];
dinner.ContactPhone = Request.Form["ContactPhone"];
// Persist changes back to database
dinnerRepository.Save();
// Perform HTTP redirect to details page for the saved Dinner
return RedirectToAction("Details", new { id = dinner.DinnerID });
}
3. 使用Controller 基類的內建方法UpdateModel()。該方法支援使用傳入的表單參數更新對象的屬性,它使用反射機制來解析對象的屬性名稱,接著基於用戶端傳入的參數值自動賦值給對象相關屬性。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
// Retrieve existing dinner
Dinner dinner = dinnerRepository.GetDinner(id);
UpdateModel(dinner);
// Persist changes back to database
dinnerRepository.Save();
// Perform HTTP redirect to details page for the saved Dinner
return RedirectToAction("Details", new { id = dinner.DinnerID });
}
4. 異常處理機制說明:
try {}
catch
{
foreach (var issue in dinner.GetRuleViolations())
{
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return View(dinner);
}
在catch代碼塊中,首先遍曆Dinner對象中所有規則衝突,並添加到ModelState對象中,接著重新顯示視圖。