仅当 ViewModel 在 MVC 中有价值时显示

Show only if a ViewModel has value in MVC

我有这个 class 和里面的许多属性

    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 检查每个 属性,更好和更有效的方法。这是我的第一个项目,因此非常感谢您的帮助。

你可以写一些东西来循环遍历 class 中的每个 属性 使用反射,但我认为你真的不想要那样。这些属性有不同的类型,我相信有一些您可能实际上不想显示(ID?)。有些是其他 classes,它变得复杂(UniversityName 是 object,而不是字符串)。此外,在您的 H4 标签中,"title" 与 属性 不同,它更像是 human-readable。因此,我认为您最好的选择是遵循您当前的模式,并为您真正想要显示的每个 属性 及其 human-readable 标题设置一个块。

我唯一的其他建议是使用 IsNullOrWhiteSpace() 而不是对字符串属性进行空检查。这是一个 cleaner/thorough 检查字符串:

if (!String.IsNullOrWhiteSpace(Model.DetailsVMCourse.Summary))

我会使用反射获取值不等于 null 的属性,然后使用循环显示属性及其值。

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>
}