Pergunta

Eu tenho um modelo que se parece mais disso:

public class SampleModel
{
    public static SampleModel Create()
    {
        return new SampleModel
        {
            Boolean = true,
            // set several more properties...
            Colors = new SelectList(new[] { "Red", "Green", "Blue" }, "Green")
        };
    }

    public bool Boolean { get; set; }
    // define several more properties...
    public SelectList Colors { get; set; }
}

Estou permitindo que o ASP.NET MVC anda automaticamente as propriedades usando Html.DisplayForModel() Para a visão dos meus detalhes e Html.EditorForModel() Para minha visão de edição.

Resultados:

  • A visão de edição funciona muito bem. Colors aparece como um menu com três itens (vermelho, verde e azul) e o verde é selecionado por padrão.

  • Para a visualização de detalhes, no entanto, eu sou "false verdadeiro falso", que aparentemente é uma lista do IsSelected valor para cada item do menu. Definitivamente, isso não quero que eu queira. Eu gostaria que apenas exibisse "verde".

  • Um outro problema é que, se eu tentar fazer UpdateModel(sampleModel) No meu controlador, recebo o erro, "nenhum construtor sem parâmetros definido para este objeto". Isso é presumivelmente porque Colors é um SelectList, e não há construtor sem parâmetros para SelectList, para que não possa completar a ligação.

Então, acho que entendo quais são os problemas, mas eu poderia realmente usar uma boa solução para esse cenário, o que parece surgir muito quando você tem modelos objetos com chaves estrangeiras.

Algumas perguntas:

  1. Como eu consigo Colors Para aparecer como um menu para a visualização Editar, mas como apenas um simples valor de string (por exemplo, "verde") na visualização de detalhes?
  2. Como posso impedir um erro "sem parâmetros de construtor" ao atualizar um modelo que contém um SelectList?
  3. Se meu modelo/viewmodel realmente continha uma chave estrangeira, ColorId, ao invés de Colors, qual seria a melhor prática para obter a exibição de detalhes para mostrar o nome da cor atual e a visualização Editar para mostrar um menu que contém todos os nomes de cores listados no Color Tabela do meu banco de dados. Se ajudar, estou usando o Linqtosql (SQLMetal) para gerar minhas classes de modelo.
Foi útil?

Solução

Todos os seus problemas decorrem do fato de você estar expondo uma lista de selecionamento como uma propriedade modelo. Dependendo da situação exata, eu provavelmente faria algo como:

  1. Crie 3 classes de modelo separadas: um modelo de "domínio" que consiste em seus objetos Linqtosql (ou invólucros ao seu redor) e dois modelos de exibição, um para a visualização de detalhes e outra para a visualização de edição.

  2. O modelo de visualização de detalhes deve conter o nome de cor atualmente selecionado. A ação de detalhes definiria essa propriedade, usando o relacionamento FK em seus objetos de domínio ou procurando manualmente os detalhes da cor selecionada.

  3. O modelo de exibição de edição deve conter uma propriedade para o ID da cor selecionada. Ele também deve conter uma lista selecionada de opções de cores disponíveis, com o valor selecionado definido para o ID atualmente selecionado.

  4. A ação de edição que lida com a postagem do formulário deve aceitar uma instância do modelo de visualização Editar e mapear essas alterações no modelo de domínio. Como a cor selecionada é exposta uma propriedade simples, em vez de uma lista de seleção, é fácil validar e mapear de volta para o objeto de negócios.

Se a sua situação for muito simples, você poderá se safar de um modelo de visualização único para visualização e edição, ou até passar o objeto de domínio diretamente para a visualização de detalhes. De qualquer forma, desde que você remova a lista de seleção do seu modelo e exponha a cor selecionada como um ID simples, você deve ficar bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top