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

问题描述 投票:2回答:3

我有这个课程和其中的很多属性

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

c# asp.net-mvc asp.net-core-mvc asp.net-mvc-viewmodel
3个回答
0
投票

您可以编写一些使用反射在类中的每个属性上循环的内容,但是我认为您确实不想要那样。这些属性具有不同的类型,并且我确定确实有一些您可能不想显示(ID?)。由于某些类是其他类,因此变得很复杂(UniversityName是一个对象,而不是字符串)。另外,在您的H4标签中,“标题”与媒体资源不同,更易于阅读。因此,我认为您最好的选择是遵循当前的模式,并为每个您要显示的属性及其可读取的标题添加一个区块。

我唯一的其他建议是使用IsNullOrWhiteSpace()而不是对字符串属性进行null检查。这是对字符串的清洁/彻底检查:

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

0
投票

我将使用反射来获取具有不等于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>
}

0
投票

您可以使用Reflection遍历Model属性并找到具有值的属性:

@using System.Reflection;

@{
    var modelProperties= Model.GetType().GetProperties();
}

@foreach(System.Reflection.PropertyInfo info in modelProperties){
   var value = info.GetValue(Model,null);
   if(value!=null){
          <h4>@info.Name</h4>
          <p>@info.DetailsVMCourse.Summary;</p>

          @*-----So on------*@
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.