Как я могу определить список Bind Include для объекта, если я передаю объект в качестве параметра в мой метод действия редактирования - PullRequest
1 голос
/ 16 марта 2012

Я хочу обработать параллельный доступ к моему веб-приложению ASP.NET MVC, поэтому я добавил в свой класс аннотацию timestamp следующим образом: -

 [MetadataType(typeof(Assessment_Validation))]
 [Bind(Include = "Date, Title")]
    public partial class Assessment {}

&

public class Assessment_Validation : IValidatableObject 
    { public DateTime Date { get; set; }

            [Required(ErrorMessage = " Assessment Title is Rquired")]
            public String Title { get; set; }

            [Timestamp]
            public Byte[] Timestamp { get; set; } }

Затем в методе Action я включил следующее: -

 [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);}

и, наконец, elearningrepository.UpdateAssessment(a): -

 public void UpdateAssessment(Assessment a)
        {
            entities1.Entry(a).State = EntityState.Modified;
        }

Выше всегда будет возвращаться DbUpdateConcurrencyException, даже если два пользователя не редактируют один и тот же объект, я думаю, что это связано с [Bind(Include = "Date, Title")] в частичном классе. Итак, как я могу передать объект в качестве аргумента в методе действия редактирования и в то же время определить список Bind для объекта ?. Проблема также, если я обновлю свой метод действия (чтобы не иметь объекта в качестве параметра) следующим образом: -, тогда DbUpdateConcurrencyException никогда не будет повышен !!!!: -

[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);

так как я могу решить эту проблему?

1 Ответ

0 голосов
/ 06 мая 2012

Вы пытались украсить свойство модели атрибутом Timestamp ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...