我如何使用(尝试)UpdateModel?

时间:2011-07-29 02:05:24

标签: asp.net-mvc asp.net-mvc-3 model-binding updatemodel defaultmodelbinder

使用(尝试)UpdateModel的正确方法是什么?

当我运行时:

  • TryUpdateModel返回true,
  • ViewData没有错误,
  • 但我的Proxy未更新。

行动方法

public void Save(string TypeName, int Id, FormCollection idontknow) {
    var types = Assembly.GetExecutingAssembly().GetTypes();
    var ObjectType=(from t in types where t.Name == TypeName select t).First();
    var Proxy = context.Set(ObjectType).Find(Id); // EF 4.1
    if (TryUpdateModel(Proxy, TypeName)) {
        var x = ViewData.GetModelStateErrors(); // no errors
    }
}

发布数据

TypeName=Thing&Id=1&Thing.Id=1&Thing.Name=hello&Thing.OptionID=2

Thing Class

public class Thing : Base {
    public virtual Nullable<int> OptionID { get; set; }
    public virtual Option Option { get; set; }
    public virtual ICollection<ListItem> ListItems { get; set; }
}
public class Base {
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    [NotMapped]
    public virtual int? EntityState { get; set; }
}

编辑:我也尝试过显式传递表单集合 TryUpdateModel(Proxy, TypeName, idontknow)

编辑#2:(回应NickLarsen)

  1. 重启VS和服务器,没有变化。
  2. 值实际上在FormCollection中。
  3. 模拟数据有效!我知道我一定要弄乱这里的东西。
  4. 使用调试器检查值。

1 个答案:

答案 0 :(得分:1)

我剥离了所有EF的东西并尝试获取该查询字符串以使用值填充模型...并且它工作得很好。

//controller class
public ActionResult Save(string TypeName, int Id, FormCollection idontknow)
{
    var Proxy = new Thing
    {
        Id = 33,
        OptionID = 2234,
        Name = "tony",
    };
    if (TryUpdateModel(Proxy, TypeName))
    {
        ViewBag.Message = "WInner";
    }

    return RedirectToAction("Index");
}
//end controller class

public class Thing : Base
{
    public virtual Nullable<int> OptionID { get; set; }
}
public class Base
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

老实说,我无法想象你的代码会阻止它工作,但我建议逐一浏览列表并在每一步之后进行测试......

  1. 保存进度并重新启动VS和开发服务器
  2. 检查这些值是否实际存在于表单数据中,可能会出现问题。
  3. 像我一样嘲笑一些垃圾数据。 (检查问题是否与EF有关)
  4. 您如何识别代理服务器未更新?在调试器中,在页面上等?
  5. 使用上述所有问题的答案编辑您的问题。