O padrão de design do MVC deve levar à separação das regras de negócios da apresentação.
Às vezes, porém, as regras de negócios afetam a apresentação. Qual é a melhor maneira de lidar com isso? É quando um ViewModel deve ser usado?
Por exemplo, voltando ao meu aplicativo de biblioteca inexistente, um bibliotecário está digitalizando livros devolvidos. O sistema indica que um livro está atrasado e aplica uma multa a esse consumidor.
Certos funcionários podem ter segurança para substituir essa multa com base em determinadas condições.
A camada de apresentação do meu aplicativo de biblioteca precisará permitir que o funcionário defina a multa como 0 ou clique em um botão para substituí-la.
Mas os funcionários que NÃO têm segurança para fazer isso devem ver a taxa como uma entrada desativada ou talvez apenas como leitura.
Observe que a segurança pode não ser a única regra comercial . Este é apenas um exemplo. Por exemplo, meu aplicativo pode ter informações de configuração definidas em algum lugar que faz com que um campo na tela se torne desnecessário etc.
Embora o código possa permitir que qualquer pessoa altere a multa e mostre uma mensagem de validação, essa não é uma boa experiência do usuário.
Qual é uma boa prática para fazer isso? As opções em que posso pensar (usando o ASP.NET MVC) são:
Faça com que a própria exibição verifique a regra de negócios e desative ou ative o campo.
Use uma função HTMLHelper que implemente a apresentação para o campo fino e faça com que a função auxiliar verifique a regra de negócios.
Faça com que o controlador verifique a regra de negócios e use uma visão diferente.
Faça com que o controlador verifique a regra de negócios e defina uma propriedade no ViewBag que indica se o campo está ativado.
Usar um ViewModel verifica a regra de negócios e define as informações indicando que o campo está ativado.
As opções 1 e 2 fazem com que a camada de apresentação precise validar regras de negócios e isso atrapalha as coisas.
A opção 3 causará duplicação de esforços, pois agora você tem duas visualizações definidas.
As opções 4 e 5 exigem que a camada de apresentação saiba que o campo PODE ser ativado ou desativado, mas não POR QUE. Eu acho que gosto mais de 4 ou 5.
Nossas outras opções em que não estou pensando?