我在我的asp.net mvc web應用程序中有以下操作方法,這會根據預期產生DbUpdateConcurrencyException
以處理可能發生的任何併發衝突: -我如何強制DbUpdateConcurrencyException被引發,即使我將FormCollection傳遞給我的Post操作方法而不是對象
[HttpPost]
public ActionResult Edit(Assessment a)
{ try
{
if (ModelState.IsValid)
{
elearningrepository.UpdateAssessment(a);
elearningrepository.Save();
return RedirectToAction("Details", new { id = a.AssessmentID });
}
}
catch (DbUpdateConcurrencyException ex)
{
var entry = ex.Entries.Single();
var clientValues = (Assessment)entry.Entity;
ModelState.AddModelError(string.Empty, "The record you attempted to edit was"
+ "modified by another user after you got the original value.");
}
catch (DataException)
{
ModelState.AddModelError(string.Empty, "Unable to save changes. Try again, and if the problem persists contact your system administrator.");
}
return View(a);}
但要避免任何在結合攻擊我已經定義的對象類[Bind(Include = "Date, Title")]
,但是這提出了一個問題,我爲上述操作方法會返回一個異常即使沒有發生併發衝突,因爲模型綁定器將無法綁定對象ID和其他值,所以我已將我的操作方法更改爲以下內容: -
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
Assessment a = elearningrepository.GetAssessment(id);
try
{
if (TryUpdateModel(a))
{
elearningrepository.UpdateAssessment(a);
elearningrepository.Save();
return RedirectToAction("Details", new { id = a.AssessmentID });
}
}
catch (DbUpdateConcurrencyException ex)
{
var entry = ex.Entries.Single();
var clientValues = (Assessment)entry.Entity;
ModelState.AddModelError(string.Empty, "The record you attempted to edit was"
+ "modified by another user after you got the original value.");
}
catch (DataException)
{ ModelState.AddModelError(string.Empty, "Unable to save changes. Try again, and if the problem persists contact your system administrator.");
}return View(a);
但書面方式操作方法爲在第二種方法將不會提高DbUpdateConcurrencyException
任何情況下(即使出現併發衝突!)。
所以我問題是如何確保DbUpdateConcurrencyException
會在發生衝突時發生,同時確保[Bind(Include = "Date, Title")]
不會發生過度綁定攻擊? 在此先感謝您的任何幫助和建議。 BR
感謝您的回覆,你的方法seesm全新的我,但我會嘗試。但是你是否意味着我正在使用的方法不會總是捕獲併發異常? BR – 2012-03-16 22:43:22
,我不想使用MVC 4現在廣告它仍然是一個測試版本,並在其deactmentation中提到它不應該用於現場系統... – 2012-03-16 22:50:38
我試過你的方法,但我得到以下錯誤「使用泛型類型'System.Collections.Generic.List'需要1個類型參數」on「列表propertyNames;」在上面的類裏面。有關此錯誤的任何建議? BR –
2012-03-17 02:26:59