2012-02-18 13 views
7

Sadece ViewModels kullanmaya başladım. En iyi uygulamayı takip edip etmediğimi görmek için bu kodu kontrol edebilir misiniz? Sıra dışı bir şey var mı? Doğrulamayı farklı yapar mısınız? Kod uzun ise (buna bu kadar çok parça var)ASP.NET MVC'de ViewModel Uygulaması - Bu kod en iyi uygulama mı?

üzgünüm. Mümkün olduğu kadar anlaşılması kolay olmaya çalıştım.

Teşekkürler!

model

public class CustomerModel 
    { 
    [Required(ErrorMessage="Primer nombre!")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage="Segundo nombre!")] 
    public string LastName { get; set; } 

    [Required(ErrorMessage="Edad")] 
    public int? Age { get; set; } 

    public string State { get; set; } 
    public string CountryID { get; set; } 

    [Required(ErrorMessage="Phone Number")] 
    public string PhoneNumber { get; set; } 
    } 

ViewModel

public class CustomerViewModel 
    { 
    public CustomerModel Customer { get; set; } 

    public string Phone1a { get; set; } 
    public string Phone1b { get; set; } 
    public string Phone1c { get; set; } 
    } 

Kontrol

public ActionResult Index() 
    { 
     CustomerViewModel Customer = new CustomerViewModel() 
     { 
     Customer = new CustomerModel(), 
     }; 


     return View(Customer); 
    } 


    [HttpPost] 
    public ActionResult Index(CustomerViewModel c) 
    { 

     //ModelState.Add("Customer.PhoneNumber", ModelState["Phone1a"]); 

     // Let's manually bind the phone number fields to the PhoneNumber properties in 
     // Customer object. 
     c.Customer.PhoneNumber = c.Phone1a + c.Phone1b + c.Phone1c; 

     // Let's check that it's not empty and that it's a valid phone number (logic not listed here) 
     if (!String.IsNullOrEmpty(c.Customer.PhoneNumber)) 
     { 
     // Let's remove the fact that there was an error! 
     ModelState["Customer.PhoneNumber"].Errors.Clear(); 
     } // Else keep the error there. 

     if (ModelState.IsValid) 
     { 
     Response.Write("<H1 style'background-color:white;color:black'>VALIDATED</H1>"); 
     } 
     return View("Index", c); 
    } 

    } 

V iew

@model MVVM1.Models.CustomerViewModel 

@using (Html.BeginForm("Index", "Detail")) 
{ 
    <table border="1" cellpadding="1" cellspacing="1"> 
    <tr> 
     <td>@Html.LabelFor(m => m.Customer.FirstName)</td> 
     <td> 
     @Html.TextBoxFor(m => m.Customer.FirstName) 
     @Html.ValidationMessageFor(m => m.Customer.FirstName) 
     </td> 
    </tr> 
    <tr> 
     <td>@Html.LabelFor(m => m.Customer.LastName)</td> 
     <td> 
     @Html.TextBoxFor(m => m.Customer.LastName) 
     @Html.ValidationMessageFor(m => m.Customer.LastName) 
     </td> 
    </tr> 
    <tr> 
     <td>@Html.LabelFor(m => m.Customer.Age)</td> 
     <td> 
     @Html.TextBoxFor(m => m.Customer.Age) 
     @Html.ValidationMessageFor(m => m.Customer.Age) 
     </td> 
    </tr> 

    <tr> 
     <td>@Html.LabelFor(m => m.Customer.PhoneNumber)</td> 
     <td width="350"> 
     @Html.TextBoxFor(m => m.Phone1a, new { size="4", maxlength="3" }) 
     @Html.TextBoxFor(m => m.Phone1b) 
     @Html.TextBoxFor(m => m.Phone1c) 
     <div> 
     @Html.ValidationMessageFor(m => m.Customer.PhoneNumber) 
     </div> 
     </td> 
    </tr> 
    <tr> 
     <td></td> 
     <td> 
     <input type="submit" value="Submit" /></td> 
    </tr> 
    </table> 
} 

cevap

2

Bir şey şudur: Örneğin, RegularExpressionAttribute Class kullanmak isteyebilirsiniz senin modeline. Görünüm modelinize bir IsValid özelliği eklemenizi ve ardından Response.Write öğesini çağırmak yerine bunu true olarak ayarlamanızı öneririm. Sonra sadece kısmi görünümü üstüne bu ekleyin: Ayrıca görünümünde ModelState alabilirsiniz ancak bazı bir iyi uygulama değildir iddia ediyorum

@if (Model.IsValid) 
{ 
    <H1 style'background-color:white;color:black'>VALIDATED</H1> 
} 

. Eğer bir şey için modeline bir özellik eklemek istemiyorsanız Ancak, sadece görünümde görebilirsiniz sadece bunu yapabilirsiniz:

@if (ViewData.ModelState.IsValid) 

Başka nitpicky şey MVC doğrulama nitelikleri tipik kullanılan olmasıdır UI'de doğrulama için. Bu doğrulama diğer alanlarda yeniden kullanılabilir, ancak bazı durumlarda alt-optimaldir. Ayrıca, her zaman etki alanı modellerinizi değiştiremeyebilirsiniz. Bu nedenle, böyle bir şey olsun bu yüzden genellikle benim görünümü modellerinde alanımdaki modellerini sarmak tek bir yerde benim UI doğrulama tüm tutmak için:

public class CustomerViewModel      
{      
    public CustomerModel Customer { get; set; } 

    [Required(ErrorMessage="Primer nombre!")]       
    public string FirstName 
    { 
     get { return Customer.FirstName; } 
     set { Customer.FirstName = value; } 
    } 
... 

Bu gereksiz görünebilir ve değer her zaman çaba değil Ancak Entity Framework etki alanı modellerini veya değiştirmesi zor veya imkansız olan diğer sınıfları kullanırken göz önünde bulundurulması iyi bir uygulamadır.

+0

Gerçekten iyi puanlar. Bir IsValid özelliği oluşturma hakkında iyi fikir. – SaltProgrammer

1

Ben senin ViewModel uygulaması oldukça standart olduğunu söyleyebilirim. Görünümünüz ve etki alanı modeliniz arasında ara nesne olarak hareket etmek için ViewModel kullanıyorsunuz. Hangisi iyi bir uygulama.

Ben yaklaşık yorgun olurdu tek şey

Model hataları işlemek ve ayrıca ViewModel bazı özelliklerini sahip olmalıdır nasıl. görünüm modelleri geri denetleyicisi VE veri iletilmesi için iyi olduğunu

if (ModelState.IsValid) 
    { 
    Response.Write("<H1 style'background-color:white;color:black'>VALIDATED</H1>"); 
    } 
    return View("Index", c); 

Unutmayın:

bana atlar
public class CustomerViewModel 
    { 
    public CustomerModel Customer { get; set; } 

    [RegularExpression(@"^\d{3}$")] 
    public string Phone1a { get; set; } 
    [RegularExpression(@"^\d{3}$")] 
    public string Phone1b { get; set; } 
    [RegularExpression(@"^\d{4}$")] 
    public string Phone1c { get; set; } 
    } 
+2

Sonuçta bu genellikle hiçbir zaman işe yaramaz. Modeller neredeyse her zaman kullanıcıya göstermek istemediğiniz verilere sahip olur. Artık sadece modeller için editör yapılamıyorsunuz ve gönderim sırasında ve gönderimlerinde yayınlama riskini üstleniyorsunuz. Çok fazla harita olduğunu biliyorum, ancak genellikle 'basit' görünüm modellerine sahip olmanın daha iyi olduğunu buldum. –

+0

Ek RegExp öznitelikleri kullanımı hakkında iyi bir fikir. – SaltProgrammer

+0

CustomerModel'in, geçerliliği kontrol etmek için aslında ek açıklamalara ihtiyacı var mı? Sadece ViewModel'in Requirement niteliklerine ihtiyacı olduğunu düşünüyorum. –

2

Sadece MVC'nin askıya alınmasını kendim alıyorum, ancak bu aynı konuyu dün araştırdım ve kişinin doğrudan bir model nesnesini ViewModel'de içermemesi gerektiği sonucuna vardım. Bu yüzden benim anlayışım CustomerModel'inizi doğrudan CustomerViewModel'e dahil etmenin kötü bir uygulama olacağını gösteriyor. Bunun yerine, ViewModel'inize eklemek istediğiniz CustomerModel özelliklerinin her birini listelemek istersiniz. Sonra el CustomerViewModel için CustomerModel verileri harita veya eylem yöntemi bu içi gibi bir kod satırı ile bunu otomatik olarak yapar AutoMapper gibi bir araç kullanmak istiyorum ya: Bu durumda

public ViewResult Example() 
{ 
    // Populate/retrieve yourCustomer here 
    Customer yourCustomer = new CustomerModel(); 

    var model = Mapper.Map<CustomerModel, CustomerViewModel>(yourCustomer); 

    return View(model); 
} 

, Mapper.Map, View'inize iletebileceğiniz bir CustomerViewModel döndürecektir.

Ayrıca Application_Start yönteminde şunlardır gerekir:

Mapper.CreateMap<CustomerModel, CustomerViewModel>(); 

Genelde ben işe gitmek için AutoMapper oldukça kolay buldum. Alan adları eşleştiğinde otomatiktir, iç içe bir Nesne yoksa veya varsa, bu eşlemeleri CreateMap satırında belirtebilirsiniz. senin CustomerModel yerine bireysel özelliklerinin Bir Adres nesnesi kullanıyorsa Yani, bunu yapmak istiyorum:

Mapper.CreateMap<CustomerModel, CustomerViewModel>() 
    .ForMember(dest => dest.StreetAddress, opt => opt.MapFrom(src => src.Address.Street)); 

Sadece yanı MVC etrafında başım alıyorum olarak yanılıyorsam kimse bana düzeltin.

İlgili konular