No ASP.NET MVC, os modelos de exibição devem ter um ID?

11

Ao desenvolver um aplicativo ASP.NET MVC que permita a atualização do modelo, é necessário saber como obter o modelo de exibição atualizado e correspondê-lo novamente ao modelo que agora está atualizado. Parece haver algumas maneiras diferentes de fazer isso e estou me perguntando se alguma delas não é MVC adequada (como ter seus dados de armazenamento do controlador que deveriam estar no modelo não é a MVC adequada)?

Todos os modelos de exibição têm um ID: profissionais

  • Sempre verifique se você pode corresponder ao seu modelo.

Contras

  • Você deve ter muito cuidado para que nenhum dos IDs tenha sido alterado, caso contrário, você poderá fazer com que os usuários atualizem as linhas às quais eles não deveriam ter acesso.

Somente os modelos de visualização mínima nua têm um ID: Prós

  • Muito menos verificação necessária para evitar que os usuários atualizem dados que não devem acessar.

Contras

  • Muito mais difícil rastrear qual modelo de exibição corresponde a qual modelo.
  • Você ainda precisa verificar os poucos modelos de exibição com IDs para garantir que o usuário não esteja atualizando dados aos quais não deve ter acesso.

Nenhum modelo de visualização tem ID:

Prós

  • Não há necessidade de verificar os IDs para atualizações.

Contras

  • Você tem que abandonar a apatridia.

Então eu tenho duas perguntas.

Primeiro, existe uma escolha correta / incorreta? (Caso contrário, isso significa que a escolha é uma questão de opinião e minha segunda pergunta é baseada na opinião e deve ser ignorada.)

Segundo, se houver uma escolha correta / incorreta, qual é?

Para esclarecer um comentário, estou falando quando você tem um modelo de exibição que é uma imitação do seu objeto de banco de dados.

Pense nisso:

public class InvoiceViewModel  //Does not have ID, does not relate to model.
{
    public CustomerViewModel CustomerVM { get; set; }  //Maybe has ID?  Does relate to model.
    public AddressViewModel BillingAddressVM { get; set; } //Ditto
    public AddressViewModel ShippingAddressVM { get; set; } //Ditto
    public List<InvoiceLineItemViewModel> ItemVMs { get; set; }  //Each one has an ID?
}

isso não:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}
Lawtonfogle
fonte
2
O que exatamente você faria com um ID do ViewModel? Os objetos individuais no ViewModel não têm seus próprios IDs?
Robert Harvey
Eu provavelmente deveria especificar apenas quando o modelo de exibição está relacionado a um modelo. Nem todos os modelos de exibição estão relacionados.
Lawtonfogle 16/10
You have to abandon statelessness.- Você acabou de escolher usar o MVC sem sentido.
Joel Etherton
O ID ao qual você está se referindo aqui é uma chave primária do banco de dados ou algo mais que você está adicionando ao ViewModel?
Vermis 21/10
@ Vermis, acho que uma chave primária de banco de dados seria uma identificação simples. Um ID mais completo seria qualquer dado não modificável que permita relacionar seu objeto editado com a versão persistente ainda não editada, para que as alterações editadas possam persistir.
precisa saber é o seguinte

Respostas:

1

O objeto ViewModel não é o que é armazenado em uma tabela de banco de dados, geralmente. São os itens individuais no objeto ViewModel que são armazenados. Cada um desses itens já possui um ID.

Por exemplo:

public class InvoiceViewModel
{
    public Customer Customer { get; set; }
    public Address BillingAddress { get; set; }
    public Address ShippingAddress { get; set; }
    public List<InvoiceLineItem> Items { get; set; }
}

Como não há uma tabela única no banco de dados que corresponda a um InvoiceViewModel, não há ID para um objeto InvoiceViewModel.

Obviamente, você sempre pode usar o InvoiceID como o ID desse ViewModel específico. O InvoiceID é útil, porque é o que esse objeto representa em última análise. Mas eu pude ver um objeto ViewModel que não corresponde a nenhum ID específico no banco de dados.

Robert Harvey
fonte
1
Pense onde, em vez de usar os modelos reais no modelo de visualização, o InvoiceViewModel contém apenas outros modelos de visualização (relacionados aos modelos).
Lawtonfogle
-1

Por padrão, você deve ter um ID em exibição, mesmo que não o esteja usando. Crie uma coluna no banco de dados nomeado como ide marque o auto incrementrecurso sobre ele para que você seja classificado.

akash
fonte
1
Isso contradiz diretamente a outra resposta, porém, sem abordar porque você deve ter um ID de qualquer maneira .
Martijn Pieters