开发者

ASP.NET-MVC2: Why does TryUpdateModel ignore properties after the second level of the object model tree?

Perhaps I'm missing something here, but it seems that anything in the object model tree 3 or more levels down, is ignored when using TryUpdateModel.

For example (simplified):

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

开发者_StackOverflow中文版Am I missing something here? If this is just the way it is, has anyone come up with a workaround?


A quick project created with the following model.

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; }
}

Here's my edit - which is essentially the same as yours

[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);
}

This all works exactly as expected with all the models created properly. The only problem that I can see happening is that you possibly aren't passing the same property names back from the form. (by not using <%: Html.TextBoxFor(model => model.A.B.C.CName)%> for example)

The models require parameterless constructors. But I'm sure you would have gotten an error about that - unless you're consuming the error.

So without more information about your project it will be hard to help as a basic setup produces expected results.


I believe the problem is in one of your model classes. Check, please, if PropertyB.SubPropertyB.SubSubPropertyA is really a property but not a field. A property should have get and set accessors.


Here's my checklist:

  1. Make sure you're getting the value back in the form request. Request["A.B.C.Name"] and etc.
  2. All the required fields are on the form.
  3. I had deleteOnNull issue with Linq to SQL: How to set DeleteOnNull from designer for future ref if you're using L2SQL.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜