如果ViewData有ViewBag,为什么TempData没有TempBag?

时间:2011-06-14 15:57:10

标签: asp.net-mvc-3

为什么TempData没有动态字典对象,就像ViewData一样?

1 个答案:

答案 0 :(得分:4)

没有因为没有人愿意实施它。但这很容易做到。例如,作为扩展方法(遗憾的是,.NET中尚不支持扩展属性,因此您无法获得您可能希望的语法):

public class DynamicTempDataDictionary : DynamicObject
{
    public DynamicTempDataDictionary(TempDataDictionary tempData)
    {
        _tempData = tempData;
    }

    private readonly TempDataDictionary _tempData;

    public override IEnumerable<string> GetDynamicMemberNames()
    {
        return _tempData.Keys;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = _tempData[binder.Name];
        return true;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        _tempData[binder.Name] = value;
        return true;
    }
}

public static class ControllerExtensions
{
    public static dynamic TempBag(this ControllerBase controller)
    {
        return new DynamicTempDataDictionary(controller.TempData);
    }
}

然后:

public ActionResult Index()
{
    this.TempBag().Hello = "abc";
    return RedirectToAction("Foo");
}

问题是:为什么你需要它?它比它更好/更安全?

public ActionResult Index()
{
    TempData["Hello"] = "abc";
    return RedirectToAction("Foo");
}