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.

Foi útil?

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:.)

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