Compreender a classe do modelo vs A classe de dados em MVC

eu desenvolvi ASP.Net aplicações ao longo dos anos usando Webforms e eu fiz algumas aplicações MVC, mas nunca realmente usar o framework na totalidade, isso é devido à restrição de tempo da maioria dos projetos. Embora, eu esteja usando a estrutura MVC eu ainda estou usando as maneiras antigas, ou seja, não usando @Html.BeginForm etc. em vez disso, utilizo a etiqueta etc.

comecei recentemente outro projecto, mas desta vez quero usar os recursos de MVC correctos.

eu fui ler sobre as melhores práticas em padrões de Design. Na minha solução, tenho projetos para a aplicação MVC, testes, e para dados (que é uma biblioteca de classe que se conecta ao banco de dados). Não estou a usar o "Entity Framework", mas ainda estou a pensar na forma correcta de criar aulas para modelos de visualização.

Na minha aula de biblioteca de Dados, tenho utilizadores de chamadas de classe.
public class User
{
    public long Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Email { get; set; }

    [Required]
    public long RoleId { get; set; }
}

os campos que eu quero desenhar na janela são Nome, E-mail e uma lista dropdownlist para o RoleId. Então, para um modelo no Veja, é correto que não tem que ser o mesmo que minha classe de dados? Abaixo de uma classe de vista de modelo correta?

public class UserModel
{
    public Data.User User { get; set; }

    public IEnumerable<KeyValuePair<long,string>> RoleList { get; set; }
}

a razão para perguntar é que, inicialmente, eu sempre assumo que as classes de modelos devem ser as mesmas que suas classes de dados que eu li no Google que na maioria dos casos não é. Está correcto?

É esta a correcta implementação da vista?

@using (Html.BeginForm())
{
   @Html.LabelFor(m=>m.User.Name)
   @Html.TextAreaFor(m=>m.User.Name)
   <br/>
   @Html.LabelFor(m => m.User.Email)
   @Html.TextAreaFor(m => m.User.Email)
   <br />
   @Html.LabelFor(m => m.User.RoleId)
   @Html.DropDownListFor(m => m.User.RoleId, new SelectList(Model.RoleList, 
    "Value", "Key"),"--Please Select--")
}
Author: mason, 2017-05-25

2 answers

Classe de Modelo representa o lado do negócio da aplicação, como No seu caso, você tem um UserModel a classe que é ter a informação de usuário e a coleção com os papéis dele, que o Modelo de Dados é específico para o repositório i.e. tabela de banco de dados no seu caso, para o Modelo de Dados normalmente representa a tabela do banco de dados que nós temos. Espero que faça sentido.

Você também pode se referir ao seguinte post que pergunta algo semelhante i pensa:

Https://stackoverflow.com/a/2446051/1875256

 0
Author: Ehsan Sajjad, 2017-05-25 14:05:37

A melhor abordagem que pode adoptar é criar um modelo (nova classe ) para cada vista em que deseja expor dados / capturar dados. Isto é indiscutivelmente mais trabalho, mas tem realmente algumas vantagens enormes. Em primeiro lugar e acima de tudo, você não acaba conectando firmemente a sua vista ao seu domínio, ou seja, a sua tabela de Usuários pode ter 20 colunas, mas você só quer expor 2 para a página de login ( nome de usuário/senha ). Em segundo lugar, através do framework MVC e razor em particular, você tem uma grande ajuda com diz respeito a coisas como validação (tanto do lado do servidor como do lado do cliente), bem como coisas como nome de exibição, etc. Além disso, no que diz respeito à gestão da sua hierarquia de dependência, você não gostaria de sujar todos os seus modelos de domínio com referências ao sistema.Site.MVC ahrrgh!!

A parte" mais trabalho " vem no controlador onde você terá de validar o seu modelo de vista e depois traduzir os seus objectos de modelo para os objectos de domínio de modo que as suas classes de Negócio todos trabalhem com um domínio consistente modelo a partir daí.

No que diz respeito à tua proposta de classe modelo, eu fá-lo-ia mais assim.
public class UserModel
{
    [Required]
    [Display(Name = "Name")]
    public string Name { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email Address")]
    public string EmailAddress { get; set; }

    [Required]
    [Display(Name = "Roles")]
    public IEnumerable<KeyValuePair<long, string>> RoleList { get; set; }
}

Como pode ver acima, porque tenho um modelo granular que pode fazer recuar completamente a vista (em oposição a ter uma referência ao objecto do utilizador), posso agora adicionar uma validação específica a cada campo conforme necessário

Tenho a certeza que há montes de razões melhores para seguir este caminho que não consigo pensar agora, mas acho que isto vai fazer-te pensar no caminho certo. linhas. feliz código.
 1
Author: Mark Redfern, 2017-05-25 14:20:26