Crie interfaces explícitas, que indicam o que você quer fazer. Eu já havia falado algo parecido em “Como nomear seus objetos”, e sigo no assunto.

Parece bobo, mas faz uma grande diferença. Crie nomes e parâmetros que tenham significado.

Tenho aqui um exemplo do que não fazer, e vem justamente da Microsoft. Todo mundo sabe como eu gosto do ASP.Net MVC, e o quanto eu acho que é uma evolução, mas o problema está justamente lá.

Para criar um “input select”, ou seja, um dropdownlist, eu fazia inicialmente da seguinte forma, mas não funcionava:

<% =Html.DropDownList("idCategoriaSelecionada", new SelectList(Model.Categorias, "Id", "Nome", Model.CategoriaSelecionada))%>

Eu esperava uma saída assim:

<select id="idCategoriaSelecionada" name="idCategoriaSelecionada">
    <option selected="selected" value="1">Livros</option>
    <option value="2">CDs</option>
</select>

Mas recebia algo assim:

<select id="idCategoriaSelecionada" name="idCategoriaSelecionada">
    <option value="1">Livros</option>
    <option value="2">CDs</option>
</select>

Repararam que não tem nenhum item selecionado? Fui ver o construtor de SelectList, que é onde indiquei o valor que queria selecionado:

namespace System.Web.Mvc
{
    public class SelectList : MultiSelectList
    {
        //um monte de código omitido
        public SelectList(IEnumerable items, string dataValueField, string dataTextField, object selectedValue);
    }
}

Tudo certo! Eu passei o objeto categoria esperado, então ele deveria estar selecionado. Depois que eu depurei com a minha própria cópia do MVC, que eu baixei do codeplex, e pude ver o problema, é que descobri que o “object selectedValue” esperado, era na verdade o valor do objeto, e não o objeto de negócio. E era o valor no contexto do SelectList, ou seja, o valor presente na minha propriedade “Id”. Ou seja, eu teria que passar “1”, para ter o option com valor “1” selecionado. Mudei o código para isso:

<% =Html.DropDownList("idCategoriaSelecionada", new SelectList(Model.Categorias, "Id", "Nome", Model.CategoriaSelecionada.Id))%>

E funcionou. Falem a verdade, isso não é uma interface mentirosa? Portanto, não faça isso! Deixe que sua interface indique o que ela está fazendo, sem o usuário precisar ficar procurando na documentação para entender. Eu, o resto do mundo, e você mesmo (quando estiver depurando) agradecemos.

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.