Pourquoi personne n'a suggéré de méthodes d'extension sur ViewData?
Option 1
Cela me semble de loin la solution la moins intrusive et la plus simple au problème. Pas de chaînes codées en dur. Aucune restriction imposée. Pas de codage magique. Pas de code complexe.
public static class ViewDataExtensions
{
private const string TitleData = "Title";
public static void SetTitle<T>(this ViewDataDictionary<T> viewData, string value) => viewData[TitleData] = value;
public static string GetTitle<T>(this ViewDataDictionary<T> viewData) => (string)viewData[TitleData] ?? "";
}
Définir les données dans la page
ViewData.SetTitle("abc");
Option 2
Une autre option, facilitant la déclaration du champ.
public static class ViewDataExtensions
{
public static ViewDataField<string, V> Title<V>(this ViewDataDictionary<V> viewData) => new ViewDataField<string, V>(viewData, "Title", "");
}
public class ViewDataField<T,V>
{
private readonly ViewDataDictionary<V> _viewData;
private readonly string _field;
private readonly T _defaultValue;
public ViewDataField(ViewDataDictionary<V> viewData, string field, T defaultValue)
{
_viewData = viewData;
_field = field;
_defaultValue = defaultValue;
}
public T Value {
get => (T)(_viewData[_field] ?? _defaultValue);
set => _viewData[_field] = value;
}
}
Définissez les données dans la page. La déclaration est plus facile que la première option, mais la syntaxe d'utilisation est légèrement plus longue.
ViewData.Title().Value = "abc";
Option 3
Ensuite, vous pouvez combiner cela avec le renvoi d'un seul objet contenant tous les champs liés à la mise en page avec leurs valeurs par défaut.
public static class ViewDataExtensions
{
private const string LayoutField = "Layout";
public static LayoutData Layout<T>(this ViewDataDictionary<T> viewData) =>
(LayoutData)(viewData[LayoutField] ?? (viewData[LayoutField] = new LayoutData()));
}
public class LayoutData
{
public string Title { get; set; } = "";
}
Définir les données dans la page
var layout = ViewData.Layout();
layout.Title = "abc";
Cette troisième option présente plusieurs avantages et je pense que c'est la meilleure option dans la plupart des cas:
Déclaration la plus simple des champs et des valeurs par défaut.
Syntaxe d'utilisation la plus simple lors de la définition de plusieurs champs.
Permet de définir différents types de données dans ViewData (par exemple, mise en page, en-tête, navigation).
Autorise du code et une logique supplémentaires dans la classe LayoutData.
PS N'oubliez pas d'ajouter l'espace de noms de ViewDataExtensions dans _ViewImports.cshtml