Иногда затраты на создание нового типа модели раздражают. В этих случаях я хочу установить ViewData, и параметры выглядят так:
Просто установите viewdata с помощью строкового ключа и вытяните его. Это имеет очевидные проблемы.
Сохраните идентификатор (строковый ключ) где-нибудь (где? На контроллере?) И выведите его на страницу просмотра. Решая одну из проблем, я все еще кастую, что проблематично, и убивает вывод типа.
Используйте строго типизированные функции Set / Get MVCContrib. Иногда они хороши, но если тип не очень описательный, скажем логическое «IsNew», они работают не слишком хорошо. Это также убивает умозаключение типов и все еще выполняет только приведение, поэтому я должен вручную синхронизировать представление и контроллер.
Итак, вместо этого я думаю об использовании фантомного типа для объединения как типа, так и идентификатора ключа. Это было бы эквивалентно этому псевдо-C #:
class ViewDataKey<T> = string
Это позволило бы мне создать идентификаторы в контроллере следующим образом:
public static readonly ViewDataKey<bool> IsNew = "IsNew";
При некоторых простых методах расширения установка данных будет такой:
ViewData.Set(IsNew, true);
Получить его так же просто:
var isNew = ViewData.Get(FrobNozzleController.IsNew);
Обратите внимание, нам не нужно указывать тип isNew, это безопасно выведено. Определения ключа и типа хранятся в одном месте.
Вопросы:
Где хранить ключ? Для ViewData "global-ish", некоторый общий класс работает отлично. Но для View / Controller конкретных данных? Есть ли какие-либо недостатки в том, чтобы положить его на контроллер? (Кроме длинного имени контроллера?)
Есть ли более простые способы или уже встроенные функции?