Как не иметь ВСЕ поля в представлении редактирования, но не получать «Переполнение при преобразовании в дату и время». - PullRequest
0 голосов
/ 15 июля 2011

Я немного новичок в MVC 3, так что это может быть что-то простое. У меня есть база данных Compact SQL 4. Существует объект Post, который имеет поля Contents (строка), Subject (строка), When (DateTime) и Reposted (DateTime nullable). Во время метода Create Post я вручную устанавливаю свойство Date в DateTime.Now, и оно прекрасно работает.

Однако в моем редактируемом представлении я НЕ хочу показывать это поле или, по крайней мере, не позволять ему быть редактируемым полем. Когда я НЕ помещаю его как редактируемое поле в окне редактирования, и они меняются, например, содержимое, а затем нажимают кнопку Сохранить, я получаю сообщение:

Произошло переполнение при преобразовании в datetime.

Во время редактирования обратной передачи я устанавливаю для поля Reposted значение DateTime.Now, поэтому оно должно быть полем Когда. Когда я отлаживаю эту обратную передачу, я вижу, что объект «Post» заполняется только значениями полей, которые я отображаю на экране. Поэтому я решил просто извлечь поле «Когда» с запросом LINQ непосредственно из данных, но когда я попадаю в SaveChanges, происходит сбой и он говорит следующее:

Объект с таким же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом

Так как я могу обновить объект и позволить пользователю изменять только несколько соответствующих полей? Похоже, объект Post не получает ВСЕ существующие значения, так как они не отображаются на экране. Как я могу полностью заполнить этот объект?

Редактировать: вот метод Post.

[HttpPost]
public ActionResult Edit(Post post) {
  if (ModelState.IsValid) {
    db.Posts.Attach(post);

    int Successes = 0;
    int Failures = 0;

    this.SendEMail(post, out Successes, out Failures);
    post.Successes = Successes;
    post.Failures = Failures;
    post.Reposted = DateTime.Now;

    db.ObjectStateManager.ChangeObjectState(post, EntityState.Modified);
    db.SaveChanges();
    return RedirectToAction("Index");
  }

  return View(post);
}

1 Ответ

0 голосов
/ 09 декабря 2011

Включите скрытое поле в поле зрения для полей, которые вы не хотите отображать, например,

@Html.HiddenFor(model => model.When)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...