我在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应该在集合中找到适当的字段进行更新。
那么,可能出现什么问题?
全部谢谢
答案 0 :(得分:1)
根据您发布的代码,审阅对象不会更新,因为FormCollection中的新值尚未绑定到您的模型。您没有使用DefaultModelBinder
。
如果您的视图是强类型的(假设类型类名为Food
),请更改您的方法签名和方法,如下所示:
public ActionResult Edit(Food food)
{
if (ModelState.IsValid)
{
FoodDB.Update(food);
return RedirectToAction("Index");
}
return View(food);
}
DefaultModelBinder将从表单中获取值并将它们绑定到您的模型。