因为我一遍又一遍地使用相同的TempData键,所以我想更容易跟踪这些键。 如果最终我能写出这样的话会很棒:
MyTempData.Message = "my message";
而不是
TempData["Message"] = "my message";
答案 0 :(得分:8)
听起来你想要一个强类型的TempData。一种方法是在Controller上编写扩展方法来执行此操作:
public static class ControllerExtensions
{
public string GetMessage(this Controller instance)
{
string result = instance.TempData["Message"] as string;
if (result == null)
{
result = "some default value or throw null argument exception";
}
return result;
}
public void SetMessage(this Controller instance, string value)
{
instance.TempData["Message"] = value;
}
}
答案 1 :(得分:5)
相当低技术的选项,但如果你只是想跟踪你正在使用的键,你可以创建一些常量:
public static class TempDataKeys
{
public const string Message = "Message";
public const string Warning = "Warning";
public const string Error = "Error";
// etc
}
然后:
TempData[TempDataKeys.Message] = "Some message";
答案 2 :(得分:0)
很难说出你希望临时数据持续到什么程度。 我的解释是,您希望能够在所有ViewModel上拥有一组共享属性。
要完成此任务,请从常见的ViewModel类继承。
public class BaseViewModel
{
public string Message{get;set;}
}
public class MyModel : BaseViewModel
{
public string MyUniquePropety{get;set;}
}
如果事实证明您希望数据在会话中持续存在,那么请实现单例,并记住在视图中添加@using语句以引用它。
答案 3 :(得分:0)
你可以模仿ViewBag
的作用。
首先,它使用名为DynamicViewDataDictionary
的内部密封类。基本上,我只是要为TempData制作一个版本。然后,我们可以使用扩展方法在Controller
,WebViewPage
等中使用它。
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;
}
}
在您的控制器中:
this.TempBag().SomeValue = "Test";
在你的剃须刀视图中:
@this.TempBag().SomeValue
如果你认为扩展方法不够干净,你可以创建自己的Controller基类,以及你自己的剃刀视图基类,它们使用漂亮,简洁的属性ala ViewBag
。