SORU
16 HAZİRAN 2012, CUMARTESİ


MVC ViewModel nedir?

ASP.NET MVC yeni duyuyorum. Bir ViewModel amacı anlamada bir sorunum var.

Bir ViewModel nedir ve neden ASP.NET MVC bir Uygulama için bir ViewModel ihtiyacımız var mı?

Eğer basit bir örnek verirsen daha iyi olur.

CEVAP
17 HAZİRAN 2012, Pazar


Birgörünüm modelibu giriş değerleri için statik metin için kullanılabilir olup olmadığını görmek/sayfasında görüntülenmesini istediğiniz sadece verileri temsil eder, (metin kutularının ve açılır listesini gibi).

Çalışanını temsil eden Employee bir sınıf var diyelimetki alanı modelive aşağıdaki dört özellikleri içerir:

public class Employee : IEntity
{
     public int Id { get; set; }  // Employee's unique identifier
     public string FirstName { get; set; }  // Employee's first name
     public string LastName { get; set; }  // Employee's last name
     public DateTime DateCreated { get; set; }  // Date when employee was created
}

Görünüm modelleri sizin bakış üzerinde kullanmak istediğiniz görünümü modelleri etki modelleri sadece veri içeren (özellikleri tarafından temsil edilen) farklı. Örneğin, yeni personel kaydı eklemek istediğiniz, görüntülemek modeli şöyle olabilir: diyelim

public class CreateEmployeeViewModel
{
     public string FirstName { get; set; }
     public string LastName { get; set; }
}

Gördüğünüz gibi sadece çalışan etki alanı modeli özelliklerini iki içerir. Neden diye sorabilirsiniz? Id görünümünden ayarlanmış olmayabilir, otomatik Çalışan tablosundaki tarafından oluşturulan olabilir. Ve DateCreated ayrıca, uygulama hizmeti katmanı saklı yordam veya ayarlanmış olabilir. Id DateCreated görünüm modeli gerekli değildir. Bir çalışanın ayrıntılar (zaten yakalanan bir çalışan) görüntülemek için bu iki özelliklerini görüntülemek isteyebilirsiniz.

Yükleme görünüm/sayfa oluşturun eylem yöntem elemanınız kumanda edecek bir örneğini oluşturur bu görünüm, model, alanları doldurmak gerekirse, ve sonra geçmek bu görünüm modeli için Görünüm/sayfa:

public class EmployeeController : Controller
{
     private readonly IEmployeeService employeeService;

     public EmployeeController(IEmployeeService employeeService)
     {
          this.employeeService = employeeService;
     }

     public ActionResult Create()
     {
          CreateEmployeeViewModel viewModel = new CreateEmployeeViewModel();

          return View(viewModel);
     }

     public ActionResult Create(CreateEmployeeViewModel viewModel)
     {
          // Do what ever needs to be done before adding the employee to the database
     }
}

Görünüm/sayfa bu gibi görünüyor (ASP.NET MVC5 ve Razor view engine kullanarak varsayarak) olabilir:

@model MyProject.Web.ViewModels.CreateEmployeeViewModel

<table>
     <tr>
          <td><b>First Name:</b></td>
          <td>@Html.TextBoxFor(x => x.FirstName, new { maxlength = "50", size = "50" })
              @Html.ValidationMessageFor(x => x.FirstName)
          </td>
     </tr>
     <tr>
          <td><b>Last Name:</b></td>
          <td>@Html.TextBoxFor(x => x.LastName, new { maxlength = "50", size = "50" })
              @Html.ValidationMessageFor(x => x.LastName)
          </td>
     </tr>
</table>

Böylece doğrulama FirstName LastName sadece biterdi. Fluent Validation böyle doğrulama gerekebilir kullanarak:

public class CreateEmployeeViewModelValidator : AbstractValidator<CreateEmployeeViewModel>
{
     public CreateEmployeeViewModelValidator()
     {
          RuleFor(x => x.FirstName)
               .NotEmpty()
               .WithMessage("First name required")
               .Length(1, 50)
               .WithMessage("First name must not be greater than 50 characters");

          RuleFor(x => x.LastName)
               .NotEmpty()
               .WithMessage("Last name required")
               .Length(1, 50)
               .WithMessage("Last name must not be greater than 50 characters");
     }
}

Veri ve açıklamalarla bu görünebilir:

public class CreateEmployeeViewModel : ViewModelBase
{
    [Display(Name = "First Name")]
    [Required(ErrorMessage = "First name required")]
    public string FirstName { get; set; }

    [Display(Name = "Last Name")]
    [Required(ErrorMessage = "Last name required")]
    public string LastName { get; set; }
}

Hatırlanması gereken şey görünüm model sadece kullanmak istediğiniz verileri temsil ederbaşka bir şey. Eğer 30 özellikleri ile bir etki alanı modeli varsa gereksiz tüm kod ve doğrulama düşünün ve sadece tek bir değeri güncelleştirmek istiyor. Sadece görünüm model/özellik bu bir değer ve etki alanı nesnesinin tüm özelliklerini değil olurdu bu senaryo göz önüne alındığında.

Görünüm bir model yalnızca bir veritabanı tablosundan veri olmayabilir. Başka bir tablodan veri birleştirebilirsiniz. Benim yukarıdaki örnekte yeni bir çalışan kaydı ekleme hakkında. Sadece ilk ve son isim eklemenin yanı sıra, aynı zamanda çalışanın bölümü eklemek isteyebilirsiniz. Bölümleri listesi Departments tablo gelecektir. Şimdi bir görünüm modeli Employees Departments tablodan veri var. Sadece daha sonra görüntülemek için aşağıdaki iki özellikleri model ekleme ve veri ile doldurmak için ihtiyacınız olacak:

public int DepartmentId { get; set; }
public IEnumerable<Department> Departments { get; set; }

Çalışanların veri (zaten veritabanına eklenmiş bir çalışan) düzenlerken benim örnek çok yukarıda farklı değil. Görünüm bir model oluşturmak, örneğin EditEmployeeViewModel Ara. Sadece ad ve soyadı gibi bu görünüm modeli düzenlemek istediğiniz veri var. Veri ve Gönder ' i seçin. Id değeri muhtemelen, örneğin: URL olmuştur. çünkü çok fazla Id alan dert olmaz

http://www.yourwebsite.com/Employee/Edit/3

Id bunu götürüp, depo katman, birlikte adınızı ve soyadınızı değerleri ile geçer.

Bir kaydı silerken, ben normalde görünüm modeli ile aynı yolu izleyin. Ayrıca, örneğin: bir URL olurdu

http://www.yourwebsite.com/Employee/Delete/3

Görünümü ilk kez yüklediğinde veritabanı 3 Id kullanarak çalışan veri almak istiyorum. Sonra sadece kullanıcı çalışan siliniyor ne görebilirsiniz böylece görüşüm sayfada statik metin görüntülemek istiyorum. Kullanıcı Sil düğmesine tıkladığında, sadece 3 Id değeri kullanın ve depo benim katmanı geçmek istiyorum. Sadece Id tablodan bir kaydı silmek gerekiyor.

Bir başka nokta da, gerçekten her eylem için Görünüm bir model gerekmez. Eğer basit bir veri ise sadece EmployeeViewModel kullanmak için iyi olurdu. Karmaşık görünümler/sayfaları ve birbirinden farklı ise, o zaman ayrı görünüm modelleri için her kullanmanızı öneririm.

Bu görünüm modelleri ve etki modelleri ile ilgili herhangi bir karışıklık düzelir umarım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • buttheadgsxr1000

    buttheadgsxr

    24 Ocak 2008
  • MandMEvangelists

    MandMEvangel

    28 Ocak 2008
  • POGProductionz

    POGProductio

    27 NİSAN 2012