javascript - 如果自表中日期以来过去 5 个月,如何对 mvc 表中的行进行着色

标签 javascript html asp.net-mvc c#-4.0

我是 Web 开发和 MVC 的新手,我有一个驱动程序模型,带有 public LastEyeCheck { get;放; } 属性,在 index.cshtml 中有一个驱动程序表。

我的问题:我想将自上次视力检查后 5 个月内与司机的行涂成红色,我该怎么做?我应该在哪里添加所需的代码?在 index.cshtml 中?在模型中?在 Controller 中?

enter image description here

驱动程序型号:

    public class Driver
    {
       [Key]

        public int LicenceID { get; set; }

        public string FirstName { get; set; }

        ....

        [DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
        public DateTime LastEyeCheck { get; set; }

        [EmailAddress]
        public string Email { get; set; }
    }

    public class DriverDBContext : DbContext
    {
        public DbSet<Driver> Drivers { get; set; }
    }

index.cshtml:

@model IEnumerable<try4.Models.Driver>

@{
    ViewBag.Title = "Index";
}
<script src="~/Scripts/MyJs.js"></script>
<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.FirstName)
        </th>
       ....
        <th>
            @Html.DisplayNameFor(model => model.LastEyeCheck)
        </th>

        <th>
            @Html.DisplayNameFor(model => model.Email)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.FirstName)
        </td>
        ....
        <td>
            @Html.DisplayFor(modelItem => item.LastEyeCheck)
        </td>

        <td>
            @Html.DisplayFor(modelItem => item.Email)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.LicenceID }) |
            @Html.ActionLink("Details", "Details", new { id=item.LicenceID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.LicenceID })
        </td>
    </tr>
}

</table>

最佳答案

您首先需要检查LastEyeCheck的日期是否已过期,例如您可以通过与今天的日期加上 5 个月进行比较来使用

bool isOverDue = item.LastEyeCheck > DateTime.Today.AddMonths(5);

然后你可以有条件地添加 classstyle属性为<td>元素。

至于逻辑去哪里,可以放在 View 中,也可以放在模型中,也可以放在 Controller 中。

例如仅在 View 中

@foreach (var item in Model)
{
    bool isOverDue = item.LastEyeCheck > DateTime.Today.AddMonths(5);
    var className = isOverDue ? "class=overdue" : "";
    <tr @className>
        ....

或者通过在 View 模型中创建一个返回 bool 的只读属性

public class DriverVM
{
    ....
    public DateTime LastEyeCheck { get; set; }
    public bool IsOverDue
    {
        get { return LastEyeCheck > DateTime.Today.AddMonths(5); }
    }
}

并在 View 中

@foreach (var item in Model)
{
    var className = item.isOverDue ? "class=overdue" : "";
    <tr @className>
        ....

或者在 Controller 中(在 View 模型中使用简单的 get; set; 属性)

public class DriverVM
{
    ....
    public DateTime LastEyeCheck { get; set; }
    public bool IsOverDue { get; set; }
}

public ActionResult Index()
{
    IEnumerable<DriverVM> model = db.Drivers.ToList().Select(x => new DriverVM
    {
        ....
        LastEyeCheck = x.LastEyeCheck,
        IsOverDue = x.LastEyeCheck > DateTime.Today.AddMonths(5)
    });
    return View(model);
}

所有这些选项都可以工作,但是在 MVC 中普遍接受的是

  • View 不应该包含复杂的逻辑(尽管这是 View 具体的逻辑所以它不是没有道理的),
  • View 应基于 view models 并且 View 模型应该是“哑”的(简单的 get; set; 属性),

并且您需要考虑如果您稍后根据其他数据更改逻辑会发生什么(例如,60 岁以上的驾驶员为 5 个月,60 岁以下的驾驶员为 12 个月),因此我建议使用最后一个选项。

关于javascript - 如果自表中日期以来过去 5 个月,如何对 mvc 表中的行进行着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45650380/

相关文章:

javascript - 我需要将此 Json Facebook 页面转换为数组以供选择

javascript - Ajax表单提交两次?

html - 模态行为异常

html - 我应该在导航菜单中使用标题标签吗

javascript - HTML5 成员函数内的作用域

asp.net-mvc - ASP.NET MVC Html.TextBox @class = "MyClass"不起作用

asp.net-mvc - UserManager.CreateAsync() 需要复杂的密码

javascript - Twitter Bootstrap 的 javascript Popover 看起来不对

javascript - Axios 在 React 应用程序中请求响应 401,但在 Postman 中工作?

c# - Entity Framework - 导航属性不保存