Страницы

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

пятница, 24 января 2020 г.

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

#c_sharp #aspnet #aspnet_mvc #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



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

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

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