Wykonuję samouczki i próbuję się nauczyć najlepszej praktyki, jeśli chodzi o rozwój MVC. Projekt, którego używam poniżej, pochodzi z Pro ASP.Net MVC5 autorstwa Apress/Adam Freeman. Jak dotąd wszystko idzie dobrze ... ale wciąż nie jestem w stanie poradzić sobie z pracą z kontrolerami. Tak, rozumiem pojęcie Kontrolerów, ale wciąż walczę, jeśli chodzi o metody post i get. Oto przykładowy przepływ mojej aplikacji MVC:Przykład MVC ViewModel
Mój projekt app.Domain
Mam tabeli użytkownika w bazie danych i odniesienie jej Podmiotów/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; }
}
}
Następnie, mieć interfejs i jest położony Streszczenie/IUsersRepository.cs
using System;
using System.Collections.Generic;
using app.Domain.Entities;
namespace app.Domain.Abstract
{
public interface IUsersRepository
{
IEnumerable<Users> Users { get; }
}
}
poruszające, teraz wypełnić moje podmioty Beton/EFUsersRepository.cs
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; }
}
}
}
Ponadto, podręcznik używa Ninjecta, który rozumiem i wszystko jest poprawnie powiązane. Nie opublikuję tego kodu, chyba że ktoś mnie o to poprosi.
Oto moje rozwiązanie app.WebUI:
Podręcznik podchodzi do mnie poprzez tworzenie ViewModel. Tutaj sprawy stają się dla mnie trochę niewyraźne. Czy ViewModel jest dodatkowym kanałem do pozyskiwania obiektów? Zamiast odwoływania się do samych modeli, czy zawsze powinienem tworzyć ViewModels, aby WYBRAĆ, UPDATE, INSERT, DELETE dane (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; }
}
}
Scenariusz jest, aby użytkownik mógł wpisać e-mail, a następnie kontroler sprawdza bazę danych do wiadomości e-mail. Jeśli istnieje, przekieruj do widoku Informacje (Controllers/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();
}
}
}
I tu jest moim zdaniem (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>
}
Wszelkie porady o tym, jak prawidłowo używać ViewModel?
ViewModel ma reprezentować stan swojej stronie. Na przykład, jeśli masz przycisk radiowy na swojej stronie, viewmodel będzie miał właściwość dla stanu przycisku radiowego. Proste widoki mogą nie mieć żadnej potrzeby dla viewmodelu, jeśli wszystko, co robią, bezpośrednio wyświetla widoki bez dodatkowych rzeczy. –
Dzięki Daniel. Tak więc puste pole tekstowe nie będzie wymagało ViewModel. Ale pole tekstowe, które chcę wypełnić podczas ładowania widoku, powinno korzystać z ViewModel? – JoshYates1980
Mam na myśli zapełnianie danych z bazy danych. – JoshYates1980