2011-12-31 12 views
5

Come posso aggiungere annotazioni/attributi alle mie classi o metodi di classi nel mio modello, generato dal mio file Model.edmx? Il motivo per cui lo sto chiedendo è perché ogni volta che aggiungo un'annotazione a una classe Model.Designer.cs, questa annotazione scompare quando apporto modifiche al mio file Model.edmx attraverso il designer.Modello MVC dal file EDMX: aggiungere annotazioni personalizzate e farle rimanere?

Più in particolare, Cerco un modo per aggiungere l'annotazione AllowHtml ad una proprietà specifica all'interno di una delle mie classi di modelli, e renderlo rimanere lì anche dopo fare in giro con esso nella vista del modello di progettazione.

Ecco il codice del controller. La proprietà Content della classe Segmento è quella che causa il blocco del mio controller quando viene popolato con HTML.

[FacebookAuthorize(Permissions = AuthenticationController.ExtendedPermissions, LoginUrl = "/Authentication/LogOn?ReturnUrl=~/Segment/Contribute")] 
    [HttpPost] 
    [ValidateInput(false)] 
    public ActionResult Contribute(int id, string content) 
    { 

     var container = new ModelContainer(); 

     var parent = container.SegmentSet.SingleOrDefault(s => s.Id == id); 

     var segment = new Segment(); 
     segment.Content = content; //this crashes with HTML data. 
     segment.Owner = AuthenticationController.Authentication.GetUser(container); 
     segment.TimeModified = DateTime.UtcNow; 
     segment.TimePosted = DateTime.UtcNow; 

     container.AddToSegmentSet(segment); 

     if (!parent.Children.Contains(segment)) 
     { 
      parent.Children.Add(segment); 
      segment.Parent = parent; 
     } 

     container.SaveChanges(); 

     return RedirectToAction("Index", "Home"); 
    } 

risposta

14

È possibile utilizzare MetadataTypeAttribute per estendere le classi:

[MetadataType(typeof(MyEdmxClassExtension))] 
public partial class MyEdmxClass { } 

public class MyEdmxClassExension 
{ 
    [AllowHtml] // Add the attributes you want to find on your property 
    public string ThePropertyYouWantToExtend { get; set; } 
} 

Questo codice va in un file separato rispetto a quello generato o si perde, anche, naturalmente.

Modifica

In risposta ai commenti qui sotto, credo che ci sono due domande. La tua domanda originale viene risposta usando lo MetadataTypeAttribute e, per il secondo, probabilmente dovresti aprire un'altra domanda.

+1

Wow, questa è una funzionalità davvero interessante! Grazie! –

+0

Nessun problema. –

+0

Tranne il fatto che non funziona. Il mio controller si blocca ancora quando riceve dati HTML. Puoi aiutarmi con questo? Ho pubblicato il codice del controller nel post originale. –

0

le annotazioni all'interno del file generato automaticamente sempre scompaiono quando il modello viene modificato nella finestra di progettazione.

È possibile estendere la classe con proprietà personalizzate scrivendo una classe parziale e memorizzandola in un file separato.

public partial class MyClass 
{ 
    [AllowHtml] 
    public int MyAnnotatedProperty 
    { 
     get { ... } 
     set { ... } 
    } 
} 

Se desiderate annotare una proprietà auto-generata un'occhiata a James D'Angelo's answer sopra.

+2

Ma lui ha questa proprietà nell'altro file. Penso che sia necessario utilizzare l'attributo Metadata per il suo problema. – gdoron

+0

Questo verrà automaticamente incluso anche nel modello generale? E sarà visibile lì? –

+0

Intendi in edmx-designer? No, non sarà visibile lì. –

0

Un'altra possibile soluzione è quella di utilizzare un modello di metadati e dati annotazioni come descritto nella here

Problemi correlati