AllowHtml-Attribut ohne MVC-Referenzierung

8

Wir haben unsere Geschäftslogikschicht und Geschäftsobjekte in ein vollständig separates Projekt / eine separate Baugruppe unterteilt. Einige Eigenschaften der Modelle können HTML-Inhalt enthalten. Vor der Geschäftslogik haben wir eine ASP.NET MVC-Webanwendung, in der Benutzer die Geschäftsobjekte verwalten können.

  • Um HTML-Inhalt für bestimmte Eigenschaften zuzulassen, mussten wir das AllowHtml-Attribut hinzufügen. Das können wir aber nicht, weil wir System.Web.Mvc in unserem Kernprojekt nicht referenzieren wollen.
  • Teilklassen können nicht für mehrere Assemblies verwendet werden.
  • Die Verwendung des MetadataType-Attributs ist keine Option, da es eine indirekte Abhängigkeit von MVC oder eine zirkuläre Abhängigkeit zwischen der Core-Ebene und der Webanwendung verursachen würde.
  • Eine andere Teillösung wäre das Deaktivieren der Anforderungsüberprüfung für die gesamte Anforderung mithilfe des ValidateInput-Attributs, aber wir möchten die Anforderungsüberprüfung nur für bestimmte Eigenschaften deaktivieren.
  • Eigenschaften sind nicht virtuell, daher können wir nicht einfach einen abgeleiteten Typ erstellen, um die spezifischen Eigenschaften zu überschreiben.
  • Wir möchten unsere Geschäftsobjekte nicht kopieren, um Modelle mit genau denselben Eigenschaften und Metadaten anzuzeigen.
  • Das Überschreiben der Modellbindungslogik ist keine Option.

Wie können wir also dem MVC-Modellbinder angeben, dass wir HTML-Inhalt nur auf bestimmten Eigenschaften zulassen möchten (ohne nur auf ASP.NET MVC in unserer Geschäftslogikebene zu verweisen)? Oder wie können Metadaten von einer anderen Assembly ohne starke Referenzen eingefügt werden?

Danke.

    
BlueCode 07.11.2013, 20:15
quelle

3 Antworten

5

Ich musste BindModel in das folgende ändern (dies baut auf der Antwort von Russ Cam auf), um das Attribut auf der tatsächlichen Eigenschaft zu überprüfen. Ich schaute auch auf diese Antwort für Hilfe:

%Vor%     
cmour 28.05.2014 18:16
quelle
3

Implementieren Sie Ihr eigenes IModelBinder und AllowHtmlAttribute - setzen Sie das Attribut in Ihr Hauptprojekt und das IModelBinder in Ihre MVC-Anwendung.

%Vor%

Um das IModelBinder zu implementieren, erben Sie einfach von DefaultModelBinder und fügen Logik hinzu, um die Anforderungsvalidierung basierend auf dem Vorhandensein Ihres eigenen AllowHtmlAttribute

abzuschalten %Vor%

Dann verbinden Sie Ihren eigenen ModelBinder in Application_Start (oder anderen Startup-Code)

%Vor%

Diese Logik im benutzerdefinierten Modellbinder ist das, was die AllowHtmlAttribute in MVC tut, aber Sie könnten diese nicht einfach verwenden, da sie in MVC untrennbar mit ModelMetadata verknüpft ist.

    
Russ Cam 07.11.2013 20:45
quelle
1

Das Anforderungsvalidierungskonzept, auf das sich AllowHtml verlässt, und die Bindungsüberprüfungen sind spezifisch für Webanforderungen. Hier gibt es keine Trennung von Bedenken, sie sind eng miteinander verbunden. Also nein, Sie können es nicht verwenden, ohne einen Verweis auf System.Web etc.

zu nehmen

Sie schließen die (meiner Meinung nach) korrekteste Option aus - Modelle anzeigen, obwohl Validierung und Bindung wirklich ein Ansichtsmodellkonzept ist.

Sie können keine tragbaren Geschäftsobjekte mit webspezifischen Bindungs- und Validierungskonzepten verwenden.

    
blowdart 07.11.2013 20:38
quelle