У меня есть следующий метод действия в моем веб-приложении asp.net mvc, который вызовет DbUpdateConcurrencyException
, как предназначенный для обработки любых одновременных конфликтов, которые могут произойти: -
[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")]
для класса объекта, но это поставило меня перед проблемой, так как описанный выше метод действия вернет исключение, даже если не будет никакого параллельного конфликта, потому что связыватель модели не будет быть в состоянии связать идентификатор объекта и другие значения, поэтому я изменил свой метод действия следующим образом: -
[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