Проблема с TryUpdateModel в MVC3

#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 примет значения из формы и привяжет их к вашей модели.