ViewData'da neden kimse uzatma yöntemleri önermedi?
Seçenek 1
Bana, sorunun en az müdahaleci ve en basit çözümü gibi görünüyor. Sabit kodlanmış dizeler yok. Hiçbir kısıtlama yoktur. Sihirli kodlama yok. Karmaşık kod yok.
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] ?? "";
}
Sayfadaki verileri ayarlayın
ViewData.SetTitle("abc");
Seçenek 2
Alan bildirimini kolaylaştıran başka bir seçenek.
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;
}
}
Sayfadaki verileri ayarlayın. Bildirim ilk seçenekten daha kolaydır, ancak kullanım sözdizimi biraz daha uzundur.
ViewData.Title().Value = "abc";
3. Seçenek
Ardından, bunu, tüm düzen ile ilgili alanları içeren tek bir nesneyi varsayılan değerleriyle birleştirerek birleştirebilir.
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; } = "";
}
Sayfadaki verileri ayarlayın
var layout = ViewData.Layout();
layout.Title = "abc";
Bu üçüncü seçeneğin birçok faydası vardır ve çoğu durumda en iyi seçenek olduğunu düşünüyorum:
Alanların ve varsayılan değerlerin en basit beyanı.
Birden fazla alan ayarlarken en basit kullanım sözdizimi.
ViewData'da çeşitli veri türlerinin ayarlanmasına izin verir (örn. Düzen, Başlık, Gezinme).
LayoutData sınıfı içinde ek kod ve mantığa izin verir.
PS ViewDataExtensions ad alanını _ViewImports.cshtml içine eklemeyi unutmayın