显示基于布尔值隐藏视图中的div

时间:2016-12-07 10:04:40

标签: c# asp.net asp.net-mvc

我目前正在使用Asp.Net MVC和C#开发应用程序。其中一个要求是检查项目的进程,然后仅显示相应的div。所以我决定在Db中创建一个包含以下内容的表:

Id     ProcessDescription       DivOneVisible        DivTwoVisible
1      Approved                 True                 False
2      Analysis                 True                 True
...

注意 - Id和ProcessDescription永远不会改变

目前该表仅包含10行数据,但想法是,将来可以添加更多行/列。

然后我继续创建适当的方法,每个Div对应一个

public bool ShowDivOne(int id)
{
   var data = uow.GetRepository<ItemProcess>().GetById(id);
   bool showDivOne = data.DivOneVisible.HasValue ? data.DivOneVisible.Value : false;

   if (showDivOne)
       return true;
   else
      return false;
}

我对ShowdivTwo()方法使用与上面相同的代码,但匹配不同的列。然后在视图中我做

@if(ShowDivOne){//div one code here}
@if(ShowDivTwo){//div two code here}

这有效,但我想知道是否有更通用的方法,我可以编写一个方法,即使添加了新的列或行,也会覆盖每个方案。

1 个答案:

答案 0 :(得分:0)

你还需要在某个地方使用Database和ViewModel之间的映射。目前它在你的方法中被硬编码。

如果您开始使用反射并且具有带属性名称的映射数组,则可以使其绝对通用。但我不建议这样做,因为它过于复杂,难以维护和改变。 (如果您愿意,我可以详细了解实施情况)。

对于您的示例,我建议每个项目都有一个viewmodel,其中包含要显示的div的属性。

public class ProcessViewModel
{
  public int Id {get;set;}
  public bool ShowDivOne {get;set;}
  public bool ShowDivTwo {get;set;}

  ProcessViewModel(){}
  ProcessViewModel(ItemProcess data){
    Id = data.Id;
    ShowDivOne = data.DivOneVisible.HasValue ? data.DivOneVisible.Value : false;
    ShowDivTwo = data.DivTwoVisible.HasValue ? data.DivTwoVisible.Value : false;
  }
}

您仍然可以单独查询每个项目或完全查询它们并将数据传递给viewmodel进行构建。

一个关于视图的简单foreach遍历视图模型列表。

扩展它以包含更多属性将是非常容易和前进的,只需要维护最少的代码。