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

UpT*_*eek 3 asp.net-mvc model-binding asp.net-mvc-2

也许我在这里遗漏了一些东西,但是当使用TryUpdateModel时,似乎忽略了对象模型树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
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?如果这是它的方式,有没有人想出一个解决方法?

Bui*_*ted 5

使用以下模型创建的快速项目.

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; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的编辑 - 与你的编辑基本相同

[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);
}
Run Code Online (Sandbox Code Playgroud)

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

这些模型需要无参数构造函数.但我相信你会得到一个错误 - 除非你消耗错误.

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