Показывать, только если ViewModel имеет значение в MVC

У меня есть этот класс и много свойств в нем

    public class Course
    {
      public int CourseId { get; set; }
      public string CourseName { get; set; }
      public Universities? UniversityName { get; set;}
      public string Summary { get; set; }
      *
      *
    }

Модель просмотра выглядит так

    public class DetailsViewModels
    {
      public Course DetailsVMCourse;
      public string PageTitle;
      *
    }

И контроллер

    public IActionResult CourseDetails(int id)
    {
        DetailsViewModels detailsViewModels = new DetailsViewModels()
        {
            //loads the course to the view model from a test database
            DetailsVMCourse = _courseRepository.FindCourse(id)
        };
        return View(detailsViewModels);
    }

Я хочу показать, только если свойство модели имеет значение в представлении. На данный момент я делаю это на странице просмотра для каждого свойства.

@{ if (Model.DetailsVMCourse.Summary != null)
  {
   <h4>Cource summary</h4>
   <p>
   @Model.DetailsVMCourse.Summary
   </p>
  }
}

Вместо того, чтобы проверять каждое отдельное свойство с !=null в поле зрения, что было бы лучше и эффективнее. Это мой первый проект, поэтому ваша помощь будет очень признательна.


person aries    schedule 28.01.2020    source источник
comment
Вы бы проверили это в представлении, как вы делаете сейчас. Или вы можете проверить его перед тем, как вернуться с акции, и выбрать другой вид на основе результата модели.   -  person Jasen    schedule 29.01.2020


Ответы (2)


Вы можете написать что-то, что будет перебирать каждое свойство в классе, используя отражение, но я думаю, что вы действительно этого не хотите. Свойства бывают разных типов, и я уверен, что есть некоторые, которые вы не хотите показывать (идентификаторы?). Поскольку некоторые из них являются другими классами, это усложняется (UniversityName — это объект, а не строка). Кроме того, в вашем теге H4 «название» — это не то же самое, что свойство, оно более удобочитаемо для человека. Поэтому я думаю, что вам лучше всего следовать вашему текущему шаблону и иметь блок для каждого свойства, которое вы действительно хотите показать, вместе с его удобочитаемым названием.

Мое единственное другое предложение состояло бы в том, чтобы использовать IsNullOrWhiteSpace() вместо нулевой проверки для строковых свойств. Это более чистая/тщательная проверка строк:

if (!String.IsNullOrWhiteSpace(Model.DetailsVMCourse.Summary))
person Bryan Lewis    schedule 28.01.2020
comment
Вы правы, не хотите использовать отражение, так как мои свойства имеют разные типы. Спасибо за помощь. :) - person aries; 29.01.2020
comment
@арий, без проблем. Если вы считаете, что это адекватный ответ, отметьте его как ответ, чтобы закрыть этот вопрос. - person Bryan Lewis; 29.01.2020

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

var populatedProperties = Model.DetailsVMCourse.GetType().GetProperties().Where(prop => prop.GetValue(Model.DetailsVMCourse) != null);

foreach (var prop in populatedProperties){
   <h4>@prop.Name</h4>
   <p>
   @prop.GetValue(Model.DetailsVMCourse);
   </p>
}
person Jossean Yamil    schedule 28.01.2020
comment
Хотя свойства бывают разных типов, но я могу использовать это в другом классе. Спасибо за идею. ???? - person aries; 29.01.2020