net mvc listboxfor example crear asp c# asp.net-mvc-5 controllers asp.net-mvc-viewmodel

c# - crear - listboxfor mvc 5 example



Ejemplo de MVC ViewModel (1)

En junio de 2014, hice esta pregunta mientras aprendía MVC. A partir de hoy, entiendo el concepto de un modelo de vista. Espero que esto ayude a otro MVC principiante:

Mi modelo que representa la tabla de la base de datos:

public partial class County : Entity { public int CountyID { get; set; } public string CountyName { get; set; } public string UserID { get; set; } public DateTime? CreatedDate { get; set; } public string ModifiedUserID { get; set; } public DateTime? ModifiedDate { get; set; } public virtual IList<Property> Properties { get; set; } public virtual DistrictOffice DistrictOffice { get; set; } public virtual IList<Recipient> Recipients { get; set; } }

Hay dos relaciones uno a muchos y una relación de uno a uno. Marco de la entidad e inyección de dependencia. (Esto no es necesario para la explicación del modelo de vista).

Primero, creo un modelo de vista para que el almacenamiento temporal pase del controlador a la vista. CountyViewModel.cs

public class CountyViewModel { [HiddenInput] public int? CountyId { get; set; } [DisplayName("County Name")] [StringLength(25)] public string CountyName { get; set; } [DisplayName("Username")] [StringLength(255)] public string Username{ get; set; } }

Usted tiene la flexibilidad de usar diferentes nombres y tipos de datos que su modelo. Por ejemplo, mi columna de base de datos es UserID, mi modelo es UserID, pero mi viewmodel es UserName. Y no necesita pasar datos a la Vista que no se usará (modelo completo). Este ejemplo solo necesita tres partes del modelo del Condado.

Dentro de mi controlador, declaro mi modelo de vista:

Necesito datos:

var county = _countyService.Get(countyId);

Siguiente,

CountyViewModel countyViewModel = new CountyViewModel(); countyViewModel.CountyId = county.CountyID; countyViewModel.CountyName = county.CountyName; countyViewModel.UserName = county.UserID;

También puedes declarar de esta manera:

CountyViewModel countyViewModel = new CountyViewModel { CountyId = county.CountyID, CountyName = county.CountyName, UserName = county.UserID };

Ahora es el momento de pasar la Vista:

return View(countyViewModel);

Dentro de la vista:

@model Project.Web.ViewModels.CountyViewModel @{ Layout = "~/Views/Shared/_Layout.cshtml"; } <div>@Model.CountyName</div> @Html.HiddenFor(model => model.CountyId) <div> @Html.TextBoxFor(model => model.CountyName, new { @class = "form-control" })

Aquí hay un ejemplo simple de pasar datos usando un modelo de vista y usar llamadas de servicio a la base de datos con Entity Framework:

Controlador de ejemplo

public class PropertyController : Controller { private readonly ICountyService _countyService; public PropertyController(ICountyService countyService) : base() { _countyService = countyService; } [HttpGet] public ActionResult NewProperty() { using (UnitOfWorkManager.NewUnitOfWork()) { ListAllCountiesViewModel listAllCountyViewModel = new ListAllCountiesViewModel() { ListAllCounty = _countyService.ListOfCounties().ToList() }; PropertyViewModel viewModel = new PropertyViewModel() { _listAllCountyViewModel = listAllCountyViewModel, _countyViewModel = new CountyViewModel(), }; return View(viewModel); } } }

Ejemplo ViewModels

public class CountyViewModel { [HiddenInput] public int? CountyId { get; set; } [DisplayName("County Name")] [StringLength(25)] public string CountyName { get; set; } [DisplayName("County URL")] [StringLength(255)] public string URL { get; set; } } public class ListAllCountiesViewModel { public string CountyName { get; set; } public IEnumerable<County> ListAllCounty { get; set; } } public class PropertyViewModel { public ListAllCountiesViewModel _listAllCountyViewModel { get; set; } public CountyViewModel _countyViewModel { get; set; } }

Ejemplo de capa de servicio

public partial interface ICountyService { County Get(int id); County GetByCompanyCountyID(int id); IEnumerable<County> ListOfCounties(); void Delete(County county); IEnumerable<State> ListOfStates(); void Add(County county); County SearchByName(string county); } public partial class CountyService : ICountyService { private readonly ICountyRepository _countyRepository; public CountyService(ICountyRepository countryRepository) { _countyRepository = countryRepository; } /// <summary> /// Returns a county /// </summary> /// <param name="id"></param> /// <returns></returns> public County Get(int id) { return _countyRepository.Get(id); } /// <summary> /// Returns a county by County Id /// </summary> /// <param name="id"></param> /// <returns></returns> public County GetByCountyID(int id) { return _countyRepository.GetByMedicaidCountyID(id); } /// <summary> /// Returns all counties /// </summary> /// <returns></returns> public IEnumerable<County> ListOfCounties() { return _countyRepository.ListOfCounties(); } /// <summary> /// Deletes a county /// </summary> /// <param name="county"></param> public void Delete(County county) { _countyRepository.Delete(county); } /// <summary> /// Return a static list of all U.S. states /// </summary> /// <returns></returns> public IEnumerable<State> ListOfStates() { var states = ServiceHelpers.CreateStateList(); return states.ToList(); } /// <summary> /// Add a county /// </summary> /// <param name="county"></param> public void Add(County county) { county.CreatedUserID = System.Web.HttpContext.Current.User.Identity.Name; county.CreatedDate = DateTime.Now; _countyRepository.Add(county); } /// <summary> /// Return a county by searching it''s name /// </summary> /// <param name="county"></param> /// <returns></returns> public County SearchByName(string county) { return _countyRepository.SearchByName(county); } }

Capa de repositorio de ejemplo

public partial class CountyRepository : ICountyRepository { private readonly Context _context; public CountyRepository(IContext context) { _context = context as Context; } public County Get(int id) { return _context.County.FirstOrDefault(x => x.CountyID == id); } public County GetByCompanyCountyID(int id) { return _context.County.FirstOrDefault(x => x.CountyID == id); } public IList<County> ListOfCounties() { return _context.County.ToList() .OrderBy(x => x.CountyName) .ToList(); } public void Delete(County county) { _context.County.Remove(county); } public County Add(County county) { _context.County.Add(county); return county; } public County SearchByName(string county) { return _context.County.FirstOrDefault(x => x.CountyName == county); } }

He estado haciendo tutoriales y tratando de aprender las mejores prácticas en lo que respecta al desarrollo de MVC. El diseño que estoy usando a continuación proviene de Pro ASP.Net MVC5 de Apress / Adam Freeman. Hasta el momento, todo está saliendo bien ... pero todavía no he aprendido a trabajar con los Controladores. Sí, entiendo el concepto de Controladores, pero todavía tengo problemas cuando se trata de publicar y obtener métodos. Aquí está el flujo de mi aplicación MVC de muestra:

Mi proyecto de app.Domain

Tengo una tabla de usuario en la base de datos y la referencia con Entidades / Usuarios.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; } } }

A continuación, tengo una interfaz y se encuentra Abstract / IUsersRepository.cs

using System; using System.Collections.Generic; using app.Domain.Entities; namespace app.Domain.Abstract { public interface IUsersRepository { IEnumerable<Users> Users { get; } } }

Moviéndome, ahora llené mis entidades 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; } } } }

Además, el libro de texto está usando Ninject, que entiendo y todo está vinculado correctamente. No publicaré ese código a menos que alguien me lo pida.

Aquí está mi solución app.WebUI:

El libro de texto me guía para crear un ViewModel. Aquí es donde las cosas se ponen un poco confusas para mí. ¿ViewModel es un canal adicional para obtener las entidades? En lugar de hacer referencia a los propios Modelos, ¿siempre debería crear ViewModels para SELECCIONAR, ACTUALIZAR, INSERTAR, ELIMINAR datos (Modelos / 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; } } }

El escenario es para que el usuario escriba un correo electrónico, luego el Controlador verifica la base de datos para el correo electrónico. Si existe, redirija a la Vista Acerca de (Controladores / 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(); } } }

Y aquí está mi Vista (Inicio / 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> }

¿Algún consejo sobre cómo usar correctamente un ViewModel?