#asp.net-mvc-3
#asp.net-mvc-3
Вопрос:
У меня проблема с TryUpdateModel в MVC3
При запуске редактирования (публикации) у меня есть следующий код:
public ActionResult Edit(int id, FormCollection collection)
{
var review = FoodDB.FindByID(id);
if (TryUpdateModel(review))
return RedirectToAction("Index");
return View(review);
}
Представление создается непосредственно VS (поэтому не изменено мной)
Если я отслеживаю код, я вижу новые значения в FormCollection, но после выполнения TryUpdateModel он возвращает true, не выдает никаких ошибок, но объект обзора не обновляется.
Что я мог сделать не так?
Редактировать
Я придумал еще несколько деталей: во-первых, БД — это не настоящая БД, а просто класс «simulation» с одним статическим списком генрихов
List<Review> Review;
Класс Review — это просто POCO, как показано ниже:
public class Review
{
public string Message { get; set; }
public DateTime Created { get; set; }
public int ID { get; set; }
public int Rating { get; set; }
}
Представление строго типизировано, сгенерировано VS из метода редактирования контроллера. Поля определяются следующим образом:
<div class="editor-label">
@Html.LabelFor(model => model.Message)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Message)
@Html.ValidationMessageFor(model => model.Message)
</div>
@Html.HiddenFor(model => model.ID)
<div class="editor-label">
@Html.LabelFor(model => model.Rating)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Rating)
@Html.ValidationMessageFor(model => model.Rating)
</div>
Вызов var review = FoodDB.FindByID(id);
возвращает объект проверки
Даже если TryUpdateModel(review)
это не работает (я просматриваю код, и я проверил объект review до и после вызова, а также collection
, и он получает правильные значения), все же review
объект не обновляется.
Однако я заменил его своим собственным рукописным методом, как показано ниже, и в этом случае объект обзора обновляется:
private void MyTryUpdateModel(Review review, FormCollection collection)
{
review.Message = collection["Message"];
review.Rating = int.Parse(collection["Rating"]);
}
Таким образом, TryUpdateMethod ДОЛЖЕН найти правильные поля в коллекции для обновления, как я понимаю.
Итак, что может быть не так?
Спасибо всем
Комментарии:
1. Вам нужно будет предоставить гораздо больше информации, чем это. Как выглядит объект обзора? Какие свойства он содержит и какого типа? Как выглядит представление? Тот факт, что он автоматически генерируется VS, не означает, что он будет работать.
2. можете ли вы подтвердить, что
FoodDB.FindByID(id)
возвращает и какого типа? кроме того, тип модели, который вы получаете из сообщения, если вы используете строго типизированные представления, нет необходимости вFormCollection collection
3. Откуда вы знаете, что значения не обновляются? Вы установили точку останова и посмотрели на объект или вы смотрите в базе данных? Потому что вы никогда не вызываете SaveChanges(), чтобы фактически сохранить обновленный объект.
Ответ №1:
На основе опубликованного вами кода объект review не обновляется, поскольку новые значения в FormCollection не были привязаны к вашей модели. Вы не используете DefaultModelBinder
.
Если ваше представление строго типизировано (и предполагается, что класс типа назван Food
), измените сигнатуру и метод вашего метода следующим образом:
public ActionResult Edit(Food food)
{
if (ModelState.IsValid)
{
FoodDB.Update(food);
return RedirectToAction("Index");
}
return View(food);
}
DefaultModelBinder примет значения из формы и привяжет их к вашей модели.