Bạn có thể bắt chước những gì ViewBag
thực hiện.
Đầu tiên, nó sử dụng lớp kín bên trong được gọi là DynamicViewDataDictionary
. Về cơ bản, tôi sẽ tạo một phiên bản cho TempData. Sau đó, chúng ta có thể sử dụng phương pháp khuyến nông để làm cho nó có sẵn trong Controller
, WebViewPage
vv
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;
}
}
Trong điều khiển của bạn:
this.TempBag().SomeValue = "Test";
Theo quan điểm dao cạo của bạn:
@this.TempBag().SomeValue
Nếu bạn không nghĩ rằng phương pháp mở rộng là đủ sạch, bạn có thể tạo lớp cơ sở điều khiển của riêng bạn, cũng như các lớp cơ sở của riêng bạn cho các khung nhìn dao cạo sử dụng các thuộc tính tốt đẹp, súc tích ViewBag
.
Làm thế nào về ViewBag thay ? –