ASP.NET-MVC2: Por que o TryUpdatemodel ignora as propriedades após o segundo nível da árvore do modelo de objeto?

StackOverflow https://stackoverflow.com/questions/3412602

Pergunta

Talvez eu esteja perdendo alguma coisa aqui, mas parece que qualquer coisa na árvore do modelo de objeto 3 ou mais níveis abaixo é ignorada ao usar o TryUpDatemodel.

Por exemplo (simplificado):

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

Estou perdendo alguma coisa aqui? Se é assim que é, alguém criou uma solução alternativa?

Foi útil?

Solução

Um projeto rápido criado com o seguinte modelo.

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

Aqui está minha edição - que é essencialmente a mesma que a sua

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

Tudo isso funciona exatamente como o esperado com todos os modelos criados corretamente. O único problema que posso ver acontecendo é que você não está passando os mesmos nomes de propriedades de volta do formulário. (por não usar <%: Html.TextBoxFor(model => model.A.B.C.CName)%> por exemplo)

Os modelos requerem construtores sem parâmetros. Mas tenho certeza de que você teria um erro sobre isso - a menos que esteja consumindo o erro.

Portanto, sem mais informações sobre o seu projeto, será difícil ajudar, pois uma configuração básica produz resultados esperados.

Outras dicas

Eu acredito que o problema está em uma de suas classes de modelo. Verifique, por favor, se Propertyb.subPropertyb.subsubPropertya é realmente uma propriedade, mas não um campo. Uma propriedade deveria ter pegue e definir Acessores.

Aqui está minha lista de verificação:

  1. Certifique -se de obter o valor de volta na solicitação de formulário. Solicitar ["abcname"] e etc.
  2. Todos os campos necessários estão no formulário.
  3. Eu tinha um problema de deleteonnull com o LINQ para SQL: Como definir DeleteOnnull do designer Para ref, se você estiver usando o L2SQL.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top