Eu crio uma selectList no meu controlador para exibir na exibição.
Estou tentando criá-lo em tempo real, meio que uma coisa ... assim ...
myViewData.PageOptionsDropDown =
new SelectList(new [] {"10", "15", "25", "50", "100", "1000"}, "15");
Compila, mas a saída é ruim ...
<select id="PageOptionsDropDown" name="PageOptionsDropDown">
<option>10</option>
<option>15</option>
<option>25</option>
<option>50</option>
<option>100</option>
<option>1000</option>
</select>
Observe como nenhum item é selecionado?
Como posso consertar isso??
c#
asp.net-mvc
selectlist
Pure.Krome
fonte
fonte
Respostas:
É assim que eu faço
À segunda vista, não sei ao certo o que você está procurando ...
fonte
SelectList sList = new SelectList(selectList, "Text", "Value", selected);
ondeselected
está o cliente selecionado atualEu uso um método de extensão:
uso
com
fonte
Usando o construtor que aceita
items, dataValueField, dataTextField, selectedValue
como parâmetros:Então, na sua opinião:
fonte
Criando a resposta de Thomas Stock, criei estes
ToSelectList
métodos sobrecarregados :No seu controlador, você pode fazer o seguinte:
E, finalmente, na sua visão, coloque:
Isso resultará na saída desejada - é claro, você pode deixar de fora a opção
"(Select one)"
Label acima se não quiser o primeiro item vazio:Atualização: Uma lista de códigos revisada pode ser encontrada aqui com comentários XML.
fonte
O problema é que o SelectList funciona como projetado. O bug está no design. Você pode definir a propriedade Selected em SelectedItem, mas isso será completamente ignorado, se você percorrer a lista com o GetEnumerator () (ou se o Mvc fizer isso por você). O Mvc criará novos SelectListItems.
Você deve usar o SelectList ctor com o SelectListItem [], o Nome do texto, o Nome do valor e o Valor selecionado. Lembre-se de passar como SelectedValue o VALUE de SelectListItem, que você deseja selecionar, não o SelectListItem em si! Exemplo:
(não testei isso, mas eu tive o mesmo problema)
a segunda opção obterá o atributo selected = "selected". Isso parece com bons e antigos DataSets ;-)
fonte
Esta é uma opção:
fonte
Se isso é literalmente tudo o que você deseja fazer, apenas declarar a matriz como string corrige o problema do item selecionado:
fonte
É muito simples fazer com que SelectList e SelectedValue funcionem juntos, mesmo que sua propriedade não seja um objeto simples como um valor Int, String ou Double.
Exemplo:
Supondo que nosso objeto Região seja algo como isto:
E seu modelo de exibição é algo como:
Você pode ter o código abaixo:
Somente se você substituir o método ToString do objeto Region para algo como:
Isso tem 100% de garantia para o trabalho.
Mas eu realmente acredito que a melhor maneira de obter o SelectList 100% funcionando em todas as circustâncias é usar o método Equals para testar o valor da propriedade DropDownList ou ListBox em relação a cada item da coleção de itens.
fonte
Parece que, se você tiver uma exibição fortemente digitada, precisará alterar o ID da lista suspensa para que NÃO seja o nome de uma propriedade na classe herdada. Você precisa colocar alguma lógica no método de edição (POST) para extrair o valor selecionado do FORMCollection e colocá-lo na sua instância antes de confirmar suas alterações.
Certamente isso é um pouco estranho, mas eu tentei e funciona.
Portanto, se a sua classe tiver um campo chamado CountryId, digamos, e você estiver exibindo uma lista de nomes de países, faça com que o menu suspenso tenha um ID de CountryName em vez de CountryId. Na postagem, você poderá fazer algo com a Collection ["CountryName"] .
fonte
Eu tive o mesmo problema. A solução é simples. Basta alterar o parâmetro "name" passado ao auxiliar DropDownList para algo que não corresponda a nenhuma das propriedades existentes no seu ViewModel. leia mais aqui: http://www.dotnetguy.co.uk/post/2009/06/25/net-mvc-selectlists-selected-value-does-not-get-set-in-the-view
Cito o Dan Watson:
Felicidades!
fonte
Todas essas respostas parecem ótimas, mas parece que o controlador está preparando os dados para uma View em um formato estruturado conhecido vs. deixando a visualização simplesmente iterar um IEnumerable <> entregue por meio do modelo e criar uma lista de seleção padrão e deixar DefaultModelBinder devolver o item selecionado a você por meio de um parâmetro de ação. Sim não, porque não? Separação de preocupações, sim? Parece estranho ter o controlador para criar algo tão específico da interface do usuário e da visualização.
fonte
Simples:
fonte
Eu apenas executei assim e não tive problemas,
e
também funcionou se você fizer isso,
e
fonte
Usando seu exemplo, isso funcionou para mim:
controlador:
Visão:
fonte
fonte
Eu faço assim:
O ToArray () cuida dos problemas.
fonte
Se você deseja passar algum texto aleatório para o DropDownList, por exemplo --Selecione--, você pode fazer isso facilmente usando este código:
fonte
Pode ser que você tenha alguma ambiguidade no seu ViewData:
Dê uma olhada aqui
fonte
o valor selecionado no modelo aproveita ao invés do item padrão. (Concordo que não li todas as postagens)
fonte
Não me lembro como o mvc 1 foi configurado, mas parece que ele queria a lista de seleção com o mesmo nome do campo ao qual pertencia ...
O que eu descobri, como alguém disse acima, é que minhas listas de seleção não estavam funcionando no mvc2 quando os ViewData para os quais foram enviados foram nomeados da mesma forma que o campo.
Por exemplo:
<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForName"]) %>
funciona quando
<%= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForID"]) %>
não funciona, pois o nome do ViewData "ForID" tem o mesmo nome do campo para o qual está trabalhando
fonte
Uma possível explicação é que o valor da lista de seleção ao qual você está vinculando não é uma sequência.
Então, nesse exemplo, o parâmetro 'PageOptionsDropDown' é uma sequência no seu modelo? Porque se não for, o valor selecionado na lista não será mostrado.
fonte
Se você procurar no código-fonte MVC 2 o método de extensão Html.DropDownList, ele nunca verifica a propriedade SelectVist da classe SelectedValue. Ele apenas tentará combinar com o seu modelo.
Todas as opções acima são todas variações de um tema, ou seja, como você envia um monte de dados para a visualização para uma lista suspensa e todos são tão bons quanto os outros (mais ou menos).
O problema está na vista. Crie seu próprio método de extensão DropDownList que respeite o valor de seleção definido ou repita manualmente. O que sempre funciona melhor para você.
fonte
Se você tem uma coleção em seu modelo e sua visualização é do tipo forte, algumas variações disso funcionarão:
-ou-
fonte