Ho svolto esercitazioni e ho cercato di apprendere le best practice per lo sviluppo di MVC. Il design che sto usando di seguito proviene da Pro ASP.Net MVC5 di Apress/Adam Freeman. Finora, tutto sta andando bene ... ma non ho ancora imparato completamente a lavorare con i Controller. Sì, capisco il concetto di Controller, ma continuo a lottare quando si tratta di pubblicare e ottenere metodi. Ecco il flusso del mio campione applicazione MVC:MVC ViewModel example
Il mio progetto app.Domain
Ho una tabella utente nel database e di riferimento con Enti/Users.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace app.Domain.Entities
{
public class Users
{
[Key]
public int UserID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string City { get; set; }
public string State { get; set; }
public DateTime CreateDate { get; set; }
public DateTime LastLogin { get; set; }
}
}
Successivamente, hanno un'interfaccia e si trova astratta/IUsersRepository.cs
using System;
using System.Collections.Generic;
using app.Domain.Entities;
namespace app.Domain.Abstract
{
public interface IUsersRepository
{
IEnumerable<Users> Users { get; }
}
}
si muove lungo, ora riempire i miei entità concrete/EFUsersRepository.cs
012.using System;
using System.Collections.Generic;
using app.Domain.Entities;
using app.Domain.Abstract;
namespace app.Domain.Concrete
{
public class EFUsersRepository : IUsersRepository
{
private EFDbContext context = new EFDbContext();
public IEnumerable<Users> Users
{
get { return context.Users; }
}
}
}
Inoltre, il libro di testo usa Ninject che capisco e tutto è legato correttamente. Non posterò quel codice a meno che qualcuno non me lo chieda.
Ecco la mia soluzione app.WebUI:
Il libro di testo mi guida attraverso la creazione di un ViewModel. Questo è dove le cose si fanno un po 'confuse per me. ViewModel è un canale aggiuntivo per ottenere le entità? Invece di fare riferimento ai Modelli stessi, dovrei sempre creare ViewModels su SELECT, UPDATE, INSERT, DELETE data (Models/UsersViewModel.cs)?
using System;
using System.Collections.Generic;
using app.Domain.Entities;
namespace app.WebUI.Models
{
public class UsersViewModel
{
//public string FirstName { get; set; }
//public string LastName { get; set; }
//public string Email { get; set; }
//public string City { get; set; }
//public string State { get; set; }
public IEnumerable<Users> Users { get; set; }
}
}
Lo scenario è per l'utente che digita un'email, quindi il controllore controlla il database per l'e-mail. Se esiste, quindi reindirizzare alla vista Informazioni (Controller/HomeController.cs).
using System.Linq;
using System.Web.Mvc;
using app.Domain.Abstract;
using app.WebUI.Models;
namespace app.Controllers
{
public class HomeController : Controller
{
private IUsersRepository repository;
public HomeController(IUsersRepository usersRepository)
{
this.repository = usersRepository;
}
[HttpGet]
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index()
{
UsersViewModel userViewModel = new UsersViewModel()
{
Users = repository.Users
.Where(p => p.Email == "[email protected]")
};
return View("About", userViewModel);
}
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
}
}
E qui è la mia opinione (Home/Index.cshtml):
@model app.WebUI.Models.UsersViewModel
@{
ViewBag.Title = "Home Page";
Layout = "~/Views/Shared/_LayoutNoMenu.cshtml";
}
@foreach (var p in Model.Users)
{
<div class="container">
@using (Html.BeginForm("About", "Home", FormMethod.Get, new { @class = "begin-form" }))
{
<h1>Welcome</h1>
<div class="required-field-block">
<textarea rows="1" class="form-control" placeholder="Email" id="filter"></textarea>
</div>
<button class="btn btn-primary" type="submit">Login</button>
}
</div>
}
Qualche consiglio su come utilizzare correttamente un ViewModel?
ViewModel dovrebbe rappresentare lo stato della vostra pagina. Ad esempio, se nella pagina è presente un pulsante di opzione, il modello di visualizzazione avrà una proprietà per lo stato del pulsante di opzione. Viste semplici potrebbero non avere alcuna necessità per un viewmodel, se tutto ciò che stanno facendo è visualizzare direttamente le viste senza ulteriori elementi. –
Grazie Daniel. Quindi, una casella di testo vuota non avrebbe bisogno di un ViewModel. Ma una casella di testo che voglio popolare quando la vista viene caricata dovrebbe usare un ViewModel? – JoshYates1980
Voglio dire popolare con i dati dal database. – JoshYates1980