5

因为我一遍又一遍地为 TempData 使用相同的键,所以我想让跟踪这些键更容易。如果最终我能写出这样的东西,那就太好了:

MyTempData.Message = "my message";

代替

TempData["Message"] = "my message";
4

4 回答 4

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;
  }
}
于 2012-06-08T21:48:32.583 回答
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";
于 2012-06-09T07:53:08.033 回答
0

很难说您希望临时数据保留在什么级别。我的解释是,听起来您希望能够在所有 ViewModel 上拥有一组共享的属性。

为此,请从通用 ViewModel 类继承。

public class BaseViewModel
{
   public string Message{get;set;}
}

public class MyModel : BaseViewModel
{
   public string MyUniquePropety{get;set;}
}

如果事实证明您希望数据在会话中持久存在,那么实现一个单例,并记住在您的视图中添加一个 @using 语句以引用它。

于 2012-06-09T06:12:09.767 回答
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

于 2012-06-09T07:00:40.880 回答