Pergunta

Estou tentando definir os valores selecionados para um MultiSelectList, mas a página não exibe nenhum valor selecionado.Eu tentei todas as maneiras práticas de fazer isso e ainda obtive os mesmos resultados.Atualmente estou tentando passar uma lista de objetos selecionados por meio do construtor.O que me incomoda é que, quando inspeciono o objeto MultiSelectList, a propriedade selectedvalues ​​contém os itens que passei para ele usando o construtor, mas ainda não é exibido.

Percebi que muitas pessoas estão tendo o mesmo problema, mas não vi uma resposta que funcionasse para mim.Tentei iterar pela lista e definir a propriedade selecionada como verdadeira, tentei criar a multiselectlist do zero e definir a propriedade selecionada de cada item individual e tentei usar o construtor.Nada disso funcionou.Também encontrei uma sugestão de que a propriedade MultiSelectList não poderia ter o mesmo nome do controle (que tentei) e isso não funcionou.Por que é tão difícil criar uma lista suspensa com valores selecionados usando esta estrutura?Estou esquecendo de algo?

<label for="StatesOfPractice">States of Practice:</label>
                    <br />
                    <%= Html.ListBox("StatesOfPractice", Model.StatesOfPracticeList)%>
                    <br />
                    <%= Html.ValidationMessage("StatesOfPractice")%>

Editar 1

Parece estar acontecendo quando instancio o MultiSelectList.Se eu inspecionar o objeto na Visualização e abrir a Visualização de Resultados, posso ver que "Alasca" não está selecionado quando sei que deveria estar.

http://imgur.com/eTIdH.jpg

Estou instanciando assim.

new MultiSelectList(List<GenericDataContract>, "Code", "Description", List<GenericDataContract>);

O GenericDataContract é simplesmente uma classe com duas propriedades, Código e Descrição.A primeira lista contém todos os estados, a segunda lista contém meus estados selecionados.

Foi útil?

Solução

Acredito que ele extraia os itens selecionados do modelo e não da lista de itens.Certifique-se de que seu StatesOfPractice A propriedade do modelo é preenchida com os itens que você deseja selecionar.Ou seja, o StatesOfPracticeList A propriedade model fornece o conjunto de itens usados ​​para preencher a lista.A propriedade do modelo StatesOfPractice que será o conjunto de valores de propriedades selecionados quando o formulário for postado, também deverá conter os valores padrão selecionados quando a visualização for renderizada.Nos bastidores, ele usa o HtmlHelper GetModelStateValue método para encontrar os valores selecionados para qualquer lista de seleção.Presumo que isso seja feito para que seja mais simples manter os valores selecionados quando houver um erro de validação e o formulário for renderizado novamente com os erros de estado do modelo.

Outras dicas

Grrrrr, encontrei.Aparentemente, os itens selecionados só podem ser uma lista de strings.Depois que modifiquei meu código para passar isso, selecionei os valores.

OK, este realmente me confundiu, mas acho que já descobri.

O problema EU tinha conseguido o MultiSelectList exibir com os padrões selecionados foi que eu estava usando @Html.DropDownListFor(...) para exibir a lista de seleção múltipla em vez de @Html.ListBoxFor(...).Confusamente, DropDownListFor Exibirá uma lista de seleção múltipla se você especificar os atributos HTML para forçá-lo a fazer isso, mas os valores padrão não vou funcionar, porque se destina apenas a ter um padrão - o seguinte será, portanto não tenha algum padrão selecionado:

List<string> myStrings;
myStrings = new List<string>();
myStrings.Add("aaa");
myStrings.Add("bbb");
myStrings.Add("ccc");

ViewData["MyStringsDropdown"] = new MultiSelectList(
    myStrings.Select(abc => new { StringId = abc, Title = abc + "Title" }),
    "StringId",
    "Title",
    myStrings.Where(str => str == "aaa" || str == "ccc").ToList()
);

...

@Html.DropDownListFor(model => model.MyStrings, (MultiSelectList)ViewData["MyStringsDropdown"], new { size = "10", multiple = "multiple" })

No entanto, o seguinte vai exibir os padrões de "aaa" e "ccc" conforme selecionado:

@Html.ListBoxFor(model => model.MyStrings, (MultiSelectList)ViewData["MyStringsDropdown"], new { size = "10", multiple = "multiple" })

Mas aqui está o verdadeiro chute;ASP.NET às vezes parece esconderijo o tipo de controle, para que você possa substituir o DropDownListFor com o ListBoxFor e ainda não pré-selecionará nenhum padrão até você reiniciar o processo de trabalho do IIS.Acho isso muito estranho e isso me confundiu por um tempo.

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