¿Por qué nadie ha sugerido métodos de extensión en ViewData?
Opción 1
Me parece, con mucho, la solución menos intrusiva y más simple al problema. Sin cadenas codificadas. Sin restricciones impuestas. Sin codificación mágica. Sin código complejo
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] ?? "";
}
Establecer datos en la página
ViewData.SetTitle("abc");
Opcion 2
Otra opción, facilitando la declaración de campo.
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;
}
}
Establecer datos en la página. La declaración es más fácil que la primera opción, pero la sintaxis de uso es un poco más larga.
ViewData.Title().Value = "abc";
Opción # 3
Luego, puede combinar eso con devolver un solo objeto que contenga todos los campos relacionados con el diseño con sus valores predeterminados.
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; } = "";
}
Establecer datos en la página
var layout = ViewData.Layout();
layout.Title = "abc";
Esta tercera opción tiene varios beneficios y creo que es la mejor opción en la mayoría de los casos:
La declaración más simple de campos y valores predeterminados.
La sintaxis de uso más simple al configurar múltiples campos.
Permite configurar varios tipos de datos en ViewData (por ejemplo, Diseño, Encabezado, Navegación).
Permite código y lógica adicionales dentro de la clase LayoutData.
PD: No olvide agregar el espacio de nombres de ViewDataExtensions en _ViewImports.cshtml