Movendo declarações condicionais complexas para trás código
-
03-07-2019 - |
Pergunta
Eu estava pensando, se movendo complexo se else ea consequente marcação html para o por trás de código viola a lei alguma 'MVC'?
Parece uma ótima opção quando confrontados com linha se else que podem se tornar extremamente ilegível.
Solução
Eu prefiro não usar o código por trás de classe em meus pontos de vista. Isto não é porque viola MVC por padrão, mas porque eu achei que a maneira "natural" (pelo menos para mim) é diferente.
Quando eu enfrentar marcação HTML complexo que se relaciona com puramente visualizar preocupações, eu costumo escrever um método de extensão para a classe HtmlHelper
, a fim de ocultar a complexidade. Assim eu tenho extensões como Html.MoneyTextBox()
, Html.OptionGroup()
e Html.Pager<T>
.
Em outros casos, quando surgem condições complexas, normalmente eu perdi alguma coisa a partir do controlador. Por exemplo, todas as questões relacionadas com a visibilidade, somente leitura ou habilitados de elementos geralmente resultam de algo que o controlador pode fornecer. Nesse caso, em vez de passar o modelo para a vista, eu criar um modelo de vista que encapsula o modelo e a informação adicional de que o controlador pode fornecer, a fim de simplificar a marcação HTML. Um exemplo típico do modelo de vista é o seguinte:
public class CustomerInfo
{
public Customer Customer { get; set; }
public bool IsEditable { get; set; } // e.g. based on current user/role
public bool NeedFullAddress { get; set; } // e.g. based on requested action
public bool IsEligibleForSomething { get; set; } // e.g. based on business rule
}
Dito isto, o código por trás é parte da visão, de modo que você pode usá-lo livremente, se ele se encaixa melhor suas necessidades.
Outras dicas
Não é horrível ter condicionais na sua opinião. Gostaria de mantê-los no ASPX não o trás código. No entanto, uma condicional, muitas vezes indica controlar o comportamento. Considere o seguinte código ASPX:
<%if (ViewData["something"] == "foo") {%>
<%=Html.ActionLink("Save", "Save") %>
<%}%>
<%if (ViewData["somethingElse"] == "bar") {%>
<%=Html.ActionLink("Delete", "Delete") %>
<%}%>
Este conjunto de condicionais representa comportamento controlador que está a ser tratada pela vista - ou seja, no lugar errado. Esse comportamento não é unidade testável. Considere em vez disso:
<%foreach (var command in (IList<ICommand>)ViewData["commands"]) {%>
<%=Html.ActionLink(command) %>
<%}%>
Neste exemplo ActionLink é uma extensão personalizada de HtmlHelper que leva o nosso próprio objeto especificação ICommand. A ação do controlador que torna este ponto de vista preenche ViewData [ "comandos"] com base em várias condições. Em outras palavras, o controlador faz o controlador. Nos testes de unidade para essa ação, podemos testar se o conjunto correto de comandos será apresentado sob várias condições.
No início isso pode parecer um aborrecimento comparação com atirando rapidamente alguns IFs na vista. A pergunta que você tem que se perguntar é: "Será que isso se representar controlar o comportamento, e eu quero garantir não em algum break point?"
Eu acredito que enquanto é um código de processamento e está em um "View" não em um controlador, em seguida, colocá-lo em código por trás ou em linha não importa. Apenas certifique-se que você não escrever este pedaço do código de processamento nas ações Controladores (desta forma você realmente vai violar o padrão MVC).
O codebehind faz parte do View - cabe a você se você quiser colocar as coisas no ASPX diretamente ou no codebehind. MVC não significa que você tem a coisas de código tudo feio na ASPX:.)