2016-07-14 17 views
0

Ich entwickle ein asp.net Core 1.0 (MVC 6) full Framework 4.6.1 und ich erstellt eine Class Library Targeting Framework 4.6.1 für Daten Modellierung mit Telerik DataAccess Kern & fließend 2016.1.224.MetadataType Attribute werden ignoriert Telerik.AccessData.Core 2016.1.224 fließende Mapping

ich einige Klassen haben, ist einer von ihnen:

namespace DataModel 
{ 
    public partial class Directory 
    { 
     private int _id; 
     public virtual int Id 
     { 
      get 
      { 
       return this._id; 
      } 
      set 
      { 
       this._id = value; 
      } 
     } 

     private string _directoryId; 
     public virtual string DirectoryId 
     { 
      get 
      { 
       return this._directoryId; 
      } 
      set 
      { 
       this._directoryId = value; 
      } 
     } 

     private string _directoryFullName; 
     public virtual string DirectoryFullName 
     { 
      get 
      { 
       return this._directoryFullName; 
      } 
      set 
      { 
       this._directoryFullName = value; 
      } 
     } 

Ich brauche DataAnnotations anpassen Anzeigenamen & Validierungen für jede Eigenschaft festzulegen. Nach telerik Dokumentation, ich bin eine andere partielle Klasse für Original erzeugt fließend Directory-Klasse erklärt es mit MetadataType zu dekorieren, wie folgt vor:

[MetadataType(typeof(Directory.DirectoryMetadata))] 
public partial class Directory 
{ 
    internal sealed class DirectoryMetadata 
    { 
     public DirectoryMetadata() 
     { 
     } 

     [Display(Name = "Id Directorio")] 
     [Required()] 
     public string DirectoryId 
     { get; set; } 

     [Display(Name = "Nombre Completo")] 
     [Required()] 
     public string DirectoryFullName 
     { get; set; } 

Wenn ich asp.net Kern app laufen, MetadataType nicht funktioniert, Name keine Anzeige noch funktioniert der Validierer. Doch aus irgendeinem Grund arbeitet Original erzeugt fließend Klasse Dekoration fein !:

public partial class Directory 
{ 
    private int _id; 
    public virtual int Id 
    { 
     get 
     { 
      return this._id; 
     } 
     set 
     { 
      this._id = value; 
     } 
    } 

    private string _directoryId; 
    [Display(Name = "Id Directorio")] 
    [Required()] 
    public virtual string DirectoryId 
    { 
     get 
     { 
      return this._directoryId; 
     } 
     set 
     { 
      this._directoryId = value; 
     } 
    } 

    private string _directoryFullName; 
    [Display(Name = "Nombre Completo")] 
    [Required()] 
    public virtual string DirectoryFullName 
    { 
     get 
     { 
      return this._directoryFullName; 
     } 
     set 
     { 
      this._directoryFullName = value; 
     } 
    } 

Beide Klassen, Originale und Metadaten sind im gleichen Namensraum. Das Deklarieren der Directory-Metadatenklasse in eine separate Datei statt intern funktioniert auch nicht.

Bitte, brauchen Sie Ihre Hilfe!

+0

Können Sie versuchen, mit öffentlichen geschachtelten Metadaten-Klasse? Das ist mein erster Verdächtiger. Wenn es nicht hilft zu überprüfen, ob Ihre Teilstücke richtig mit Dekompilierungswerkzeug (wie JustDecompile) genäht werden – ViktorZ

+0

Hallo ViktorZ, verschachtelte öffentliche Klasse für Metadaten zu verwenden, wie Sie vorgeschlagen, funktioniert nicht einmal als öffentliche Teilklasse. Wenn Sie JustDecompile verwenden, werden die Metadaten der öffentlichen Klasse in die ursprüngliche Klasse Directory und über das mit MetadataType dekorierte Klassenverzeichnis angezeigt. Es funktioniert jedoch nicht. Auf der anderen Seite, wenn ich Metadaten als eine getrennte Klasse verstehe, ich meine, nicht geschachtelt, funktioniert es auch nicht, JustDecompile zeigt es gut. Ich habe eine Seite gelesen, die in Core ModelMetadataDetailsProvider verwendet wird, aber ich weiß nicht, wie man es benutzt, jedoch ¿Wie ist es möglich, dass die Verwendung der originalen Klasse dekoriert gut funktioniert? –

+0

Auch ist im Internet kommentiert, dass ModelMetadataTypeAttribute MetadataTypeAttribute ersetzt, aber die letzte wird immer noch verwendet, weil die Dekoration der ursprünglichen Klasse perfekt funktioniert. –

Antwort

1

Ich habe selbst eine Lösung gefunden.

Für Asp.Net Kernprojekte hatte ich ModelMetadataTypeAttribute statt MetadataTypeAttribute von Microsoft.AspNetCore.Mvc.Core Montage zu verwenden. Das Dekorieren einer Metadatenklasse (Buddy-Klasse) erfolgt nach der gleichen Methode wie Display (...), DisplayName (...), dasselbe gilt für Validatoren. Unabhängig davon, ob sich die Buddy-Klasse (Metadata Class) außerhalb oder innerhalb der Modellklasse befindet.

Die Verwendung von MetadataTypeAttribute direkt mit der Modellklasse anstelle einer Buddy-Klasse funktioniert jedoch einwandfrei!

Die einzige Erklärung, die ich zu dieser Divergenz geben könnte, ist die neu aufkommende Kerntechnologie von Microsoft Asp.Net, die Verlagerung von DLL-Prozessen und -Funktionalitäten.

+0

Hallo, ich kann meine Validierungen nicht mit ModelMetadataType arbeiten. Dies funktionierte in MVC5. Es funktioniert einfach nicht mit meinen Validierungen in MVC6. Können Sie mir helfen, zu zeigen, wie Ihre Validierungen funktionieren? Vielen Dank!! – snekkke

+0

Snekkke, Soweit ich weiß, ist MetadataTypeAttribute die reguläre Form, um die Modellklasse vor MVC6 zu dekorieren. Seit ASP.NET Core 1.0 hat sich die Vorgehensweise durch die Verwendung des Namespaces Microsoft.AspNetCore.Mvc.Core ein wenig geändert. Die folgenden Schritte wurden ausgeführt: Ich habe eine Klassenbibliothek für die Speichermodellklasse erstellt und Microsoft.AspNetCore.Mvc hinzugefügt. Kernmontage zu vorher genanntem Projekt. Die ursprüngliche Modellklasse wurde ohne Verzierungen beibehalten, da ich ein ORM-Tool verwende, das automatisch Modellklassen generiert und alle Änderungen verlieren kann. –

+0

Also habe ich eine Buddy-Klasse zum Dekorieren erstellt, zB: ORM-generierte Klasse: Namespace Iridium.BackendCore \t öffentliche Teilklasse Usuario \t { \t \t private Zeichenfolge _id; \t \t public virtual String Id \t \t { \t \t \t bekommen \t \t \t { \t \t \t \t Rückkehr this._id; \t \t \t} \t \t \t gesetzt \t \t \t { \t \t \t \t this._id = Wert; \t \t \t} \t \t} etc. –