Można naśladować to, co robi ViewBag
.
Najpierw używa wewnętrznej zamkniętej klasy o nazwie DynamicViewDataDictionary
. Zasadniczo zamierzam zrobić wersję tego dla TempData. Następnie, możemy użyć metody rozszerzenie, aby była dostępna w Controller
, WebViewPage
itp
public sealed class DynamicTempDataDictionary : DynamicObject
{
private readonly Func<TempDataDictionary> _tempDataThunk;
public DynamicTempDataDictionary(Func<TempDataDictionary> viewDataThunk)
{
_tempDataThunk = viewDataThunk;
}
private TempDataDictionary ViewData
{
get { return _tempDataThunk(); }
}
public override IEnumerable<string> GetDynamicMemberNames()
{
return ViewData.Keys;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = ViewData[binder.Name];
return true;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
ViewData[binder.Name] = value;
return true;
}
}
public static class TempBagExtensions
{
private const string TempBagKey = "__CurrentTempBagDictionary";
public static dynamic TempBag(this ControllerBase controller)
{
return GetCurrentDictionary(controller.ControllerContext);
}
public static dynamic TempBag(this WebViewPage viewPage)
{
return GetCurrentDictionary(viewPage.ViewContext.Controller.ControllerContext);
}
private static DynamicTempDataDictionary GetCurrentDictionary(ControllerContext context)
{
var dictionary = context.HttpContext.Items[TempBagKey] as DynamicTempDataDictionary;
if (dictionary == null)
{
dictionary = new DynamicTempDataDictionary(() => context.Controller.TempData);
context.HttpContext.Items[TempBagKey] = dictionary;
}
return dictionary;
}
}
W kontrolerze:
this.TempBag().SomeValue = "Test";
w widoku z ostrzami:
@this.TempBag().SomeValue
Jeśli nie myśl, że metoda rozszerzenia jest wystarczająco czysta, możesz stworzyć własną klasę bazową kontrolera, a także własne klasy bazowe dla widoków maszynki, które używają ładnych, zwięzłych właściwości ala ViewBag
.
Jak o ViewBag zamiast ? –