2011-01-06 10 views
1

Ich habe drei Projekte/Bibliotheken.ASP.NET MVC POCO Klassen und Validierung

Site (WCF Service)
SiteModel (POCO-Objekte)
SiteMVC (Web Application)

In meiner SiteModel Bibliothek habe ich habe nur Objekte POCO. Diese Objekte werden von einer t4-Vorlage generiert, daher möchte ich nichts ändern. Der SiteService verwendet diese POCO-Objekte und serialisiert sie (das ist der Grund für die Verwendung von POCO-Objekten anstelle der generierten Klassen aus dem EF-Designer)

In der WebApplication möchte ich die Validierung für diese POCO-Objekte verwenden. Ich möchte meine Modellbibliothek so sauber wie möglich halten und DataAnnotations nicht verwenden, da die Regeln in den verschiedenen Anwendungen variieren können.

Was ist der beste Weg für die Validierung in ASP.NET MVC2? Ist es möglich, DataAnnotations (Buddy-Klasse) zu verwenden?

Antwort

3

Wenn Ihre T4-Vorlage teilweise Klassen generiert, dann haben Sie Glück.

Sie können eine separate Teildefinition erstellen und schmücken ihn mit MetadataType:

// T4 Generated Code 
public partial class Item 
{ 
    public int Id { get; set; } 
    public string Name { get; set; }   
} 

// Your partial in a separate file 
[MetadataType(typeof(ItemValidation))] 
public partial class Item 
{ 
} 

// Any DataAnnotations go here 
public partial class ItemValidation 
{ 
    [Required(ErrorMessage = "You need to have a Name!")] 
    public string Name { get; set; } 
} 

Andernfalls Ihre einzige andere Möglichkeit wäre Viewmodels mit DataAnnotations im Web-Projekt zu erstellen und dann zwischen den Models (sauber POCO Karte Objekte) und Ihre ViewModels.

+0

+1: clever (aber ich glaube, Sie haben die zweite 'öffentliche partielle Klasse Item' Deklaration verpasst). – rsenna

+0

@rsenna - Ich war zu besorgt, um den Rest getippt zu bekommen. Haha. Fest. –

+0

Sieht gut aus, danke! – Steven

0

FYI. Während die Teilklasse funktioniert. Wenn Sie RIA oder WCF verwenden und die Eigenschaft angezeigt werden soll, müssen Sie das Attribut [DataMember] hinzufügen.

public partial class Employee 
{  
    [DataMember] 
    public string ComposedName 
    { 
     get 
     { 
      return String.Format("{0}, {1}", this.LastName, this.FirstName); 
     } 
     set 
     { throw new NotImplementedException(); } 
    } 
} 
Verwandte Themen