Страницы

Поиск по вопросам

понедельник, 18 марта 2019 г.

C# 6.0. Elvis-оператор для переменных типа dynamic

Добрый день!
При написании приложения на MVC возникла следующая ситуация: У меня есть в базе данных таблица User, в которой есть поле IdRole, которое может быть null. Класс-модель для таблицы User выглядит так (эта модель сгенерировалась с помощью ADO.NET):
[Table("risksdb.user")] public partial class user { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public user() { risk_record = new HashSet(); }
[Key] public int IdUser { get; set; }
public int? IdRole { get; set; }
[Required] [StringLength(45)] public string Login { get; set; }
[Required] [StringLength(45)] public string Password { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection risk_record { get; set; }
public virtual role role { get; set; } }
Как видно, свойство Role может принимать null. Для вывода таблицы user, я использую ViewBag, который является dynamic. В него (ViewBag.Users)я помещаю IEnumerable Users в своем контроллере и в cshtml-файле я вывожу его примерно так:

IdUser

IdRole

Login

Password

@foreach (var u in ViewBag.Users) {

@u.IdUser

@u.IdRole

@u.Login

@u.Password

}
Вопрос: Нужно ли делать проверку на null для поля переменной типа dynamic или нет? Если да, то как правильно сделать это и где (в контроллере или еще где-то)?
Доп. вопрос: Как лучше передавать в cshtml-файл модель: через ViewBag или через параметр object model?


Ответ

1) Зависит от того, может быть у этой переменной значение null или нет. Если в контроллере всегда безусловно что-то присваиваете ViewBag.Users, то и над проверкой заморачиваться ни к чему. Проверку нужно проводить там, где может возникнуть ошибка. Например, в представлении ошибка может возникнуть в цикле foreach, если ViewBag.Users будет равен null
2) Конечно же через object model. Это удобный и общепринятый механизм. Достаточно в представлении (cshtml-файл) добавить строку @model IEnumerable и далее к модели обращаться через переменную Model. Это сразу даёт понимание типа модели. С передачей через ViewBag нет строгой типизации и понять, какого типа там данные может быть сложно. P.s. Просто представьте, что вы программируете только бизнес-логику приложения, а все представления в вашей команде пишет "верстальщик". Чтобы он каждый раз не спрашивал вас как получить из модели те или иные данные вы можете сказать ему, что в качестве модели передаете экземпляр класса User, поля данных которого заведомо описаны в вашем коде.

Комментариев нет:

Отправить комментарий