ASP.NET-MVC2: почему TryUpdateModel игнорирует свойства после второго уровня дерева объектной модели? - PullRequest
3 голосов
/ 05 августа 2010

Возможно, я что-то здесь упускаю, но кажется, что что-либо в дереве объектной модели на 3 или более уровней ниже, игнорируется при использовании TryUpdateModel.

Например (упрощенно):

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 ]

5 голосов
/ 05 октября 2010

Быстрый проект, созданный со следующей моделью.

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)%>)

Для моделей требуются конструкторы без параметров.Но я уверен, что вы получили бы ошибку об этом - если только вы не потребляете ошибку.

Так что без дополнительной информации о вашем проекте будет трудно помочь, поскольку базовая настройка дает ожидаемые результаты.

3 голосов
/ 06 октября 2010

Я считаю, что проблема в одном из ваших моделей классов. Проверьте, пожалуйста, действительно ли PropertyB.SubPropertyB.SubSubPropertyA является свойством, а не полем. Свойство должно иметь get и set accessors.

1 голос
/ 11 октября 2010

Вот мой контрольный список:

  1. Убедитесь, что вы возвращаете значение в запросе формы.Запрос ["ABCName"] и т. Д.
  2. Все обязательные поля находятся в форме.
  3. У меня была проблема deleteOnNull с Linq to SQL: Как установить DeleteOnNull из конструктора для будущей ссылки, если вы используете L2SQL.
...