Я занимаюсь учебными пособиями и пытаюсь научиться лучшей практике, когда дело доходит до разработки MVC. Дизайн, который я использую ниже, представлен Pro ASP.Net MVC5 от Apress/Adam Freeman. Пока все идет хорошо... но я до сих пор не совсем понимаю, как работать с контроллерами. Да, я понимаю концепцию Контроллеров, но все еще борюсь, когда дело доходит до поста и получает методы. Вот поток моего примера приложения MVC:
Мой проект app.Domain
У меня есть пользовательская таблица в базе данных и ссылаюсь на нее с Entities/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; }
}
}
Далее у меня есть интерфейс, и он расположен Аннотация /IUsersRepository.cs
using System;
using System.Collections.Generic;
using app.Domain.Entities;
namespace app.Domain.Abstract
{
public interface IUsersRepository
{
IEnumerable<Users> Users { get; }
}
}
Двигаясь вперед, теперь я заполняю свои объекты Concrete/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; }
}
}
}
Кроме того, в учебнике используется Ninject, который я понимаю, и все связано правильно. Я не буду публиковать этот код, если кто-то не попросит меня.
Вот мое приложение app.WebUI:
Учебник проводит меня через создание ViewModel. Здесь все становится немного нечетким для меня. Является ли ViewModel дополнительным каналом для получения объектов? Вместо того, чтобы ссылаться на сами модели, должен ли я всегда создавать ViewModels для SELECT, UPDATE, INSERT, DELETE данных (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; }
}
}
Сценарий заключается в том, что пользователь вводит электронное письмо, затем контроллер проверяет базу данных для электронной почты. Если он существует, переадресовываем его в "О представлении" (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();
}
}
}
И вот мой View (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>
}
Любые советы по правильному использованию ViewModel?