MVC-ViewModel-Beispiel

Ich mache tutorials und versuchen zu lernen, best practice, wenn es um die MVC-Entwicklung. Das design, das ich verwende unten kommt, von der Pro ASP.Net MVC5 von Apress/Adam Freeman. So weit, alles kommt gut...aber ich habe noch nicht ganz gekommen, um Griff auf die Arbeit mit Controllern. Ja, ich verstehe das Konzept von Controllern, die aber immer noch kämpfen, wenn es um post-und get-Methoden. Hier ist der Fluss meiner Beispiel-MVC-Anwendung:

Meine app.Domain-Projekt

Ich habe eine user-Tabelle in der Datenbank, und verweisen Sie mit Personen/Benutzer.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; }

}
}

Weiter, ich habe eine Schnittstelle und es liegt Abstract/IUsersRepository.cs

using System;
using System.Collections.Generic;
using app.Domain.Entities;

namespace app.Domain.Abstract
{
public interface IUsersRepository
{
    IEnumerable<Users> Users { get; }
}
}

Bewegt, jetzt fülle ich meine Entitäten 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; }
    }
}
}

Auch, das lehrbuch ist mit Ninject, die ich verstehe, und alles, was gebunden ist korrekt. Ich will nicht posten, dass der code, es sei denn, jemand bittet mich um.

Hier ist meine app.WebUI Lösung:

Das lehrbuch führt mich durch die Erstellung eines ViewModel. Dies ist, wo die Dinge ein wenig verschwommen für mich. Ist das ViewModel einen zusätzlichen Kanal, um die Entitäten? Anstelle von verweisen auf die Modelle selbst, sollte ich immer ViewModels erstellen, AUSWÄHLEN, AKTUALISIEREN, EINFÜGEN, LÖSCHEN von Daten (Modelle/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; }
}
}

Das Szenario ist für den Benutzer geben Sie eine E-Mail, dann überprüft der Controller die Datenbank für die E-Mail. Wenn es vorhanden ist, dann umleiten auf die info-View (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();
    }
}
}

Und hier ist meine Ansicht (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>
}

Irgendwelche Tipps, wie man richtig mit einem ViewModel?

Das viewmodel ist repräsentieren soll-Zustand Ihrer Seite. Zum Beispiel, wenn Sie einen radio-button auf Ihrer Seite, ist das viewmodel würde, eine Eigenschaft, die für den Zustand der radio-Taste. Einfache Ansichten kann nicht wirklich eine Notwendigkeit für ein viewmodel, wenn alle Sie tun, ist direkt die Anzeige von Ansichten ohne zusätzliche Sachen.
Danke Daniel. So, eine leere textbox bräuchte nicht ein ViewModel. Aber eine textbox, möchte ich Auffüllen, wenn die Ansicht geladen sollte ein ViewModel?
Ich meine, zum füllen mit Daten aus der Datenbank.
ViewModels können in der Regel eine Kombination von mehr als einem Modell. Sagen Sie, dass Sie möchten, dass ein Benutzer, um alle Ihre profile, die in der Regel gespeichert ist, die in mehr als einer Tabelle, damit beim Abfragen von Daten wir konvertieren es zu ViewModel, die zeigen können die vollständigen Informationen für den Benutzer-Profil-Ansicht.

InformationsquelleAutor JoshYates1980 | 2014-06-28

Schreibe einen Kommentar