代码之家  ›  专栏  ›  技术社区  ›  UpTheCreek

ASP.NET-MVC2:为什么TryUpdateModel忽略对象模型树的第二级之后的属性?

  •  3
  • UpTheCreek  · 技术社区  · 14 年前

    也许我在这里遗漏了一些东西,但是在使用TryUpdateModel时,似乎忽略了对象模型树3级或3级以上的任何内容。

    例如(简化):

    public virtual ActionResult SomeAction(int id, FormCollection form)
        {
    
            IValueProvider vpFrom = form.ToValueProvider();
            /*
            At this stage, vpForm contains:
            1)PropertyA
            2) PropertyB.SubPropertyA
            3) PropertyB.SubPropertyB.SubSubPropertyA
            */
    
            TryUpdateModel(someObjectModel, null, null, null, vpFrom);
            //The first two properties are applied, number (3) seems to be ignored
    

    我是不是漏了什么?如果事情就是这样,有人想出解决办法吗?

    3 回复  |  直到 14 年前
        1
  •  5
  •   Buildstarted    14 年前

    public class TestModel {
        public TestModelA A { get; set; }
        public string Name { get; set; }
    }
    
    public class TestModelA {
        public TestModelB B { get; set; }
        public string Name { get; set; }
    }
    
    public class TestModelB {
        public TestModelC C { get; set; }
        public string Name { get; set; }
    }
    
    public class TestModelC {
        public TestModelD D { get; set; }
        public string Name { get; set; }
    }
    
    public class TestModelD {
        public TestModelE E { get; set; }
        public string Name { get; set; }
    }
    
    public class TestModelE {
        public string Name { get; set; }
    }
    

    [HttpPost]
    public ActionResult Edit(FormCollection form) {
        IValueProvider vpFrom = form.ToValueProvider();
    
        Models.TestModel t = new Models.TestModel();
    
        TryUpdateModel(t, null, null, null, vpFrom);
    
        return View(t);
    }
    

    在正确创建所有模型的情况下,这一切都完全符合预期。我看到的唯一问题是,您可能没有从表单中传回相同的属性名(不使用 <%: Html.TextBoxFor(model => model.A.B.C.CName)%> (例如)

    模型需要无参数构造函数。但我相信你会得到一个错误,除非你消费的错误。

    因此,如果没有关于您的项目的更多信息,将很难提供帮助,因为基本设置会产生预期的结果。

        2
  •  3
  •   Alexander Prokofyev    14 年前

    我相信问题出在你的一个模型课上。请查收,如果 实际上是一个属性而不是一个字段。房产应该有

        3
  •  1
  •   Cyril Gandon niktrs    13 年前

    这是我的清单:

    1. 确保您在表单请求中获得了值。请求[“A.B.C.名称”]等。
    2. 表单上有所有必填字段。
    3. 我对Linq to SQL有deleteOnNull问题: How to set DeleteOnNull from designer