Строго типизированные расширения ASP.NET MVC ViewData - где разместить идентификаторы? - PullRequest
1 голос
/ 23 января 2009

Иногда затраты на создание нового типа модели раздражают. В этих случаях я хочу установить ViewData, и параметры выглядят так:

  1. Просто установите viewdata с помощью строкового ключа и вытяните его. Это имеет очевидные проблемы.

  2. Сохраните идентификатор (строковый ключ) где-нибудь (где? На контроллере?) И выведите его на страницу просмотра. Решая одну из проблем, я все еще кастую, что проблематично, и убивает вывод типа.

  3. Используйте строго типизированные функции 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, это безопасно выведено. Определения ключа и типа хранятся в одном месте.

Вопросы:

  1. Где хранить ключ? Для ViewData "global-ish", некоторый общий класс работает отлично. Но для View / Controller конкретных данных? Есть ли какие-либо недостатки в том, чтобы положить его на контроллер? (Кроме длинного имени контроллера?)

  2. Есть ли более простые способы или уже встроенные функции?

Ответы [ 4 ]

2 голосов
/ 23 января 2009

Одной из идей было бы создание кортежей для строго типизированного представления в тех случаях, когда вы не хотите создавать определенный класс модели представления:

class SimpleModel<T>

class SimpleModel<T, U>

class SimpleModel<T, U, V>

Затем создайте строго типизированное представление, как обычно. Теперь у вас есть преимущества строгой типизации без необходимости создавать новый класс для каждого случая.

.NET 4.0 имеет встроенный кортеж и т. Д.

2 голосов
/ 23 января 2009

Я думаю, что это то, что модель делает в шаблоне MVC. Почему вы не используете типизированное представление вместо этого?

Я полагаю, что вы просто усложняете ситуацию, вводя еще одну зависимость между контроллером и представлением. Я не вижу какой-либо конкретной выгоды с точки зрения строки кода или чего-то подобного. Вы должны объявить о существовании переменной, что вы также сделаете в определении класса модели.

Вы не получите существенного преимущества при этом.

0 голосов
/ 02 июня 2009

Я только что опубликовал пост, посвященный этой теме.

http://agilefutures.com/index.php/2009/06/mvc-strongly-typed-global-viewdata

Надеюсь, что это полезно.

Привет

Tobi

0 голосов
/ 26 января 2009

Я бы по-прежнему использовал словарь ViewData, и вместо того, чтобы «отбрасывать его», я бы просто использовал ToString () и Html.Encode. Зачем нарушать схему MVC?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...