Ich habe einen Blocktyp, den ich in einem bestimmten Inhaltsbereich auf einer bestimmten Seite verwende. Gibt es einen Weg, den ich validieren kann (auf Seitenebene oder Inhaltsebene), dass Block nicht mehr als einmal verwendet wird?Wie schränkt man die Anzahl eines im Contentbereich verwendeten Blocktyps ein?
1
A
Antwort
2
Hier ist eine Beispielvalidierungsattributklasse, die helfen sollte. Ich arbeite an einem "Validierungsregeln" nugget-Paket, von dem ich dachte, dass es das einschließen könnte. Ich habe nur die Regel "Min nach Objekttyp" hinzugefügt, aber vor der Veröffentlichung weitere hinzugefügt.
Klasse:
using EPiServer;
using EPiServer.Core;
using EPiServer.ServiceLocation;
using System;
using System.ComponentModel.DataAnnotations;
using System.Reflection;
namespace eGandalf.Epi.Validation.Lists
{
/// <summary>
/// Detects whether the minimum required items of a specific type within a ContentArea condition has been met. Only supports items that can be loaded by IContentLoader. Supports type inheritance.
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true, Inherited = true)]
public class MinimumOfTypeAttribute : ValidationAttribute
{
public int Limit { get; }
public Type ObjectType { get; }
public MinimumOfTypeAttribute(int limit, Type t)
{
Limit = limit;
ObjectType = t;
}
public override bool IsValid(object value)
{
if (value == null && Limit > 0) return false;
var area = value as ContentArea;
if (area != null) return ValidateContentArea(area);
throw new TypeMismatchException("Minimum of type only works with ContentArea properties.");
}
private bool ValidateContentArea(ContentArea area)
{
if (area?.Items?.Count < Limit) return false;
var typeCount = 0;
foreach (var item in area.Items)
{
if (CanLoadContentByType(item.ContentLink))
{
typeCount++;
// Return as soon as the validation is true.
if (typeCount >= Limit) return true;
}
}
return false;
}
private bool CanLoadContentByType(ContentReference reference)
{
var loader = ServiceLocator.Current.GetInstance<IContentLoader>();
var loaderType = loader.GetType();
MethodInfo getMethod = loaderType.GetMethod("Get", new Type[] { typeof(ContentReference) });
MethodInfo genericGet = getMethod.MakeGenericMethod(new[] { ObjectType });
try
{
var content = genericGet.Invoke(loader, new object[] { reference });
return content != null;
}
catch (Exception ex)
{
return false;
}
}
public override string FormatErrorMessage(string name)
{
return $"ContentArea {name} must include at least {Limit} items of type {ObjectType.Name}";
}
}
}
Beispielanwendung auf einem Inhaltsbereich:
[MinimumOfType(1, typeof(RssReaderBlock))]
public virtual ContentArea RelatedContentArea { get; set; }
Ergebnis in Editor-Ansicht, wenn ungültig (verhindert veröffentlichen):
1
Verwandte Themen
- 1. Wie schränkt man Wiederholungsversuche ein?
- 2. Erkennen eines Inline-/Blocktyps eines DOM-Elements
- 3. Wie schränkt man ein Attribut eines Elements in XSD ein?
- 4. PHP - Wie schränkt man eine API ein?
- 5. Wie schränkt man Fehler ein, die von iframe kommen - htaccess
- 6. Wie schränkt man Prolog-Fakten ein?
- 7. Wie schränkt man die wählbaren Datumsbereiche in Bootstrap Datepicker ein?
- 8. Wie schränkt man die Bandbreite mit Java netty korrekt ein?
- 9. Wie schränkt man die Registrierung ein und erstellt eigene Anmeldedaten?
- 10. Wie schränkt man die automatische Vervollständigung in Webstorm ein?
- 11. Wie schränkt man die% Funktionalität von vim ein?
- 12. Wie schränkt man die Dateitypen in FileUpload in MVC3 ein?
- 13. Wie schränkt man die Ankreuzfeldauswahl in angularjs ein
- 14. Wie schränkt man die Berechtigung zum Ausführen von Skripten ein?
- 15. Wie schränkt man die Eingabe von Float-Werten ein?
- 16. Wie schränkt man ein Protokoll nur auf Werttypen ein?
- 17. Schränkt das LDAP-Protokoll die Länge eines DN ein?
- 18. Wie schränkt man den Datumsbereich eines jquery Datepickers ein, indem man zwei Daten gibt?
- 19. Wie schränkt man einen bestimmten Befehl in bash ein?
- 20. Wie schränkt man Google Formular-Antworten auf angemeldete Benutzer ein?
- 21. Wie schränkt man das Upload-Bildverhältnis auf 16: 9 im Code-Signierer ein?
- 22. Wie schränkt man die CPU-Auslastung ein, die ein C# -Programm benötigt?
- 23. Wie schränkt man eine Methode auf einen bestimmten Thread ein?
- 24. Wie schränkt man den Jgit DiffFormatter auf Java-Datei ein?
- 25. React Router - Wie schränkt man Params in der Routenanpassung ein?
- 26. Wie schränkt man eine Ansicht auf Superuser ein?
- 27. Wie schränkt man Dateitypen mit HTML-Eingabedateityp ein?
- 28. Wie schränkt man eine Telefonnummer in SQLite ein?
- 29. Wie schränkt man den PHP-Dateizugriff auf das Ausführungsverzeichnis ein?
- 30. Schränkt die Shell-Map das Schlüsselformat ein?
Möchten Sie Stellen Sie sicher, dass es nur einen Block im Inhaltsbereich gibt, einen Block dieses Typs (aber möglicherweise mit m verschiedene andere Arten) oder beides? Ich denke, dass dies mit einem Validierungsdekorator ziemlich ohne die Ereignishaken unten getan werden kann. – egandalf