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

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

0 голосов
/ 16 октября 2011

У меня проблема с 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, не выдает никакой ошибки, но объект обзора не обновляется.

Что я могу сделать не так?

РЕДАКТИРОВАТЬ

Я придумываю еще некоторые детали: во-первых, БД - это не реальная БД, а просто "симуляция"- класс с одним статическим родовым списком.

List<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 из метода Editконтроллер.Поля определены следующим образом:

    <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) не работает (я прослеживаю код и проверял объект обзора до ипосле вызова, а также collection, и он получает правильные значения), но объект review не обновляется.

Однако я заменил его собственным рукописным методом, как показано ниже, и в этом случае объект обзора обновляется:

    private void MyTryUpdateModel(Review review, FormCollection collection)
    {
        review.Message = collection["Message"];
        review.Rating = int.Parse(collection["Rating"]); 
    }   

Так что TryUpdateMethod ДОЛЖЕН найти подходящие поля в коллекции для обновления, как я понимаю.

Итак, что может быть не так?

Спасибо всем

1 Ответ

1 голос
/ 16 октября 2011

На основании опубликованного вами кода объект обзора не обновляется, поскольку новые значения в FormCollection не были привязаны к вашей модели.Вы не используете DefaultModelBinder.

Если ваше представление строго типизировано (и предполагается, что класс типа назван Food), измените сигнатуру и метод вашего метода следующим образом:

public ActionResult Edit(Food food)
{
    if (ModelState.IsValid)
    {
        FoodDB.Update(food);
        return RedirectToAction("Index");
    }
    return View(food);
}

DefaultModelBinder возьмет значения из формы и свяжет их с вашей моделью.

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