Если есть ViewBag для ViewData, почему нет TempBag для TempData?

Почему для TempData нет объекта динамического словаря, как для ViewData?


person jaffa    schedule 14.06.2011    source источник


Ответы (1)


Нет, потому что никто никогда не удосужился его реализовать. Но это было бы тривиально легко сделать. Например, в качестве метода расширения (к сожалению, свойства расширения еще не поддерживаются в .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");
}
person Darin Dimitrov    schedule 14.06.2011
comment
Хорошо, спасибо за это. В ответ на ваш вопрос, зачем тогда ViewData? - person jaffa; 14.06.2011
comment
@jaffa, я понятия не имею, и, честно говоря, меня это мало волнует. Я никогда не нуждался в них и использовал их в любом случае. Для меня ViewData/ViewBag являются злом, и их использование подразумевает плохо спроектированное приложение ASP.NET MVC. - person Darin Dimitrov; 14.06.2011