【发布时间】:2015-02-03 12:21:05
【问题描述】:
我知道 asp.net mvc web 应用程序中的 html 助手,例如 Html.EditorFor Html.TextBoxFor 等会查看表单集合,如果找不到值,它将使用模型值,除非调用 @987654321 @ 但现在我有以下后期编辑操作方法,我正在检查并发异常:-
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit(Skill skill)
{
try
{
var dbskill = db.Skills.SingleOrDefault(a => a.SkillID == skill.SkillID);
db.Entry(dbskill).State = EntityState.Detached;
skill.Created = dbskill.Created;
skill.Modified = System.DateTime.Now;
skill.CreatedBy = dbskill.CreatedBy;
skill.ModifiedBy = staffrepo.GetUserIdByUserName(User.Identity.Name.Substring(User.Identity.Name.IndexOf("\\") + 1));
skill.DeletedDate = dbskill.DeletedDate;
skill.IsActive = dbskill.IsActive;
skill.StatusID = db.SkillStatus.Where(a => a.SkillStatusName.ToLower().StartsWith("pen")).SingleOrDefault().SkillStatusID;
if (ModelState.IsValid)
{
skill.CurrentVersion = dbskill.CurrentVersion + (Decimal)0.01;
db.Entry(skill).State = EntityState.Modified;
await db.SaveChangesAsync();
return RedirectToAction("Details", new { id =skill.SkillID});
}
}
catch (DbUpdateConcurrencyException ex)
{
var entry = ex.Entries.Single();
var clientValues = (Skill)entry.Entity;
var databaseEntry = entry.GetDatabaseValues();
var databaseValues = (Skill)databaseEntry.ToObject();
var currentSkillTypename = db.SkillTypes.SingleOrDefault(a => a.SkillTypeID == databaseValues.SkillTypeID).Name;
var currentSkillStatusname = db.SkillStatus.SingleOrDefault(a => a.SkillStatusID == databaseValues.StatusID).SkillStatusName;
var currentModifiedByName = db.Staffs.SingleOrDefault(a => a.StaffID == databaseValues.ModifiedBy).SamAccUserName;
if (databaseEntry == null)
{
ModelState.AddModelError(string.Empty, "Unable to save changes. The department was deleted by another user.");
}
else
{
if (databaseValues.Name != clientValues.Name)
ModelState.AddModelError("Name", "Current value: " + databaseValues.Name);
//code goes here...........
ModelState.AddModelError(string.Empty, "The record you attempted to edit "
+ "was modified by another user after you got the original value. The "
+ "edit operation was canceled and the current values in the database "
+ "have been displayed. If you still want to edit this record, click "
+ "the Save button again. Otherwise click the Back to List hyperlink.");
skill.timestamp = databaseValues.timestamp;
}
}
catch (Exception e)
{
var c = e;
}
//
return View(skill);
}
我感到困惑的是在异常中使用它:-
skill.timestamp = databaseValues.timestamp
现在,由于我在视图上使用 hiddenfor 将时间戳传递给后期编辑操作方法,因此这意味着 Skill.timestamp 将始终相同,用户将始终收到并发异常,因为 Html. Hiddenfor 将始终从模型中读取值,因此时间戳将始终相同,但发生的情况是在第一次并发异常之后,并且如果用户单击保存,那么第二次他的修改将被保存。 ..那么有人可以就此提出建议吗?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-5 html-helper modelstate