在MVC3中使用TryUpdateModel的问题

时间:2011-10-16 09:44:20

标签: asp.net-mvc-3

我在MVC3中有一个TryUpdateModel的问题

当触发编辑(帖子)时,我有以下代码:

    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,不会抛出任何错误,但审查对象不会更新。

我能做错什么?

修改

我想出了更多细节: 首先,db不是真正的DB,而只是一个“模拟” - 具有一个静态genric列表的类

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,并且它收到了正确的值),但是{ {1}} obj未更新。

但是,我用自己的手写方法替换它,如下所示,在这种情况下,审查对象会更新:

review

因此,正如我所理解的那样,TryUpdateMethod应该在集合中找到适当的字段进行更新。

那么,可能出现什么问题?

全部谢谢

1 个答案:

答案 0 :(得分:1)

根据您发布的代码,审阅对象不会更新,因为FormCollection中的新值尚未绑定到您的模型。您没有使用DefaultModelBinder

如果您的视图是强类型的(假设类型类名为Food),请更改您的方法签名和方法,如下所示:

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

DefaultModelBinder将从表单中获取值并将它们绑定到您的模型。