【问题标题】:ASP.NET Razor Entity Framework using Case statement against the modelASP.NET Razor Entity Framework 对模型使用 Case 语句
【发布时间】:2015-01-03 01:45:22
【问题描述】:

我正在尝试找到正确的方法来做到这一点,我希望能提供一些指导。我有一个带有视图的脚手架实体框架控制器,以及我的模型中引用枚举的多个项目:

public enum JobStatus
{
    NotStarted, InProgress, AwaitingReboot, Completed
}

public class Job
{
    public int JobID { get; set; }
    public string CompanyName { get; set; }
    public string EngineerName { get; set; }
    public string ServerName { get; set; }

    public JobStatus? OverallJobStatus { get; set; }

    public JobStatus? WindowsUpdateCompleted { get; set; }
    public JobStatus? MicrosoftUpdateCompleted { get; set; }
    public JobStatus? ExchangeUpdateCompleted { get; set; }
    public JobStatus? FirmwareUpdateCompleted { get; set; }
    public JobStatus? SymantecSEPMUpdateCompleted { get; set; }
    public JobStatus? SymantecClientsUpdateCompleted { get; set; }
    public JobStatus? BackupSoftwareUpdateCompleted { get; set; }
    public JobStatus? BackupManualCheckCompleted { get; set; }
    public JobStatus? EventViewerCheckCompleted { get; set; }
    public JobStatus? DiskDefragCompleted { get; set; }
    public JobStatus? RecreateSBSMonitoring { get; set; }

index.cshtml 将其引用为(这里是一个例子):

@Html.DisplayFor(modelItem => item.ExchangeUpdateCompleted)

这一切都很好,在每行的相关列中,我得到了 NotStarted 或 AwaitingReboot 等的作业状态。

我有四个跨度类代表一个引导字形图标:

<span class="glyphicon glyphicon-ok green"></span>
<span class="glyphicon glyphicon-remove red"></span>
<span class="glyphicon glyphicon-star gold"></span>
<span class="glyphicon glyphicon-off red"></span>

我想做的不是显示 NotStarted 或 AwaitingReboot 等,而是显示 span 类。

我认为这需要一个 switch/case 语句。在 MVC 框架中,合适的位置在哪里?我假设最有效的方法是通过某种函数来传递作业状态并输出正确的跨度类?任何带有代码示例的方向都将不胜感激。

基于此我将如何在实际代码中显示它

【问题讨论】:

  • 你有没有想过使用DisplayTemplate

标签: asp.net asp.net-mvc entity-framework razor


【解决方案1】:

我会使用显示模板来做到这一点。

首先创建文件夹 /Views/Shared/DisplayTemplates 并在其中添加一个名为 JobStatus.cshtml 的视图(即名称与类型匹配。)在该视图中,放置确定要输出的 HTML 的逻辑。例如:

@model QuartelyMaintenance.Models.JobStatus

@{
    string icon = "ok";
    string colour = "green";

    switch (Model)
    {
        case QuartelyMaintenance.Models.NotStarted:
            icon = "star";
            colour = "red";
            break;
        case QuartelyMaintenance.Models.AwaitingReboot :
            icon = "off";
            colour = "green";
            break;
    }
}
<span class="glyphicon glyphicon-@icon @colour"></span>

现在你可以像往常一样使用它,MVC 会选择这个模板:

@Html.DisplayFor(modelItem => item.ExchangeUpdateCompleted)

【讨论】:

  • 如果我能做到这一点,这看起来很棒,但我正在努力让它工作,我得到的名字 'JobStatus' 在当前上下文中不存在。我在文件的根目录中有@model QuartelyMaintenance.Models.JobStatus
  • 我已更改以匹配您的命名空间。在 case 语句中也使用命名空间。
【解决方案2】:

我会在你的模型类中创建一个静态方法:

public static string GetHtmlForJobStatus(JobStatus status)
{
    switch(status)
    {
        case JobStatus.Completed:
        {
            return @"<span class="glyphicon glyphicon-ok green"></span>"
        }
        case JobStatus.Completed:
        {
            return @"<span class="glyphicon glyphicon-remove red"></span>"
        }

        // the rest of your cases
    }
}

然后,在您看来,您可以为每个人调用它:

@Html.Raw(Model.GetHtmlForJobStatus(Model.ExchangeUpdateCompleted))

【讨论】:

  • 如果你返回MvcHtmlString而不是字符串,那么你就不需要在视图中使用Html.Raw。虽然我个人喜欢避免将 HTML 放在这样的代码中,因此我更喜欢 DisplayTemplates。
  • @DavidG 是的,我来回返回字符串或 HtmlString。我认为这两种方法的代码量都差不多,而且两种方法都相当清楚。
  • @DavidG 我同意您的 DisplayTemplate 方法。无论如何,最好把这个开关埋得越深越好——它们很丑。
  • 不仅仅是代码量,更重要的是视图的简单性。无论如何,这种方法本身并没有错。您还可以在枚举上使用属性并在显示模板中选择它们。可能有点矫枉过正,但编写代码很有趣!
  • PS 你仍然可以向我 +1 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多