2

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

当我运行这个:

  • TryUpdateModel返回真,
  • 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

事物类

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:(回应尼克拉森)

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

1 回答 1

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. 使用上述所有问题的答案编辑您的问题。
于 2011-07-29T03:01:51.323 回答