C# MVC应用程序是否应该在其视图中执行日期时间计算?

C# MVC应用程序是否应该在其视图中执行日期时间计算?,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个DaysPastDueinteger属性。应根据DueDatedatetime属性过去的天数进行计算。该计算是在控制器内部还是直接在视图上进行?从程序上看,那会是什么样子 控制器.cs // GET: myController [Authorize(Roles = "Admin")] public ActionResult Index() { var myVariable= myData.Include(moreD

我有一个
DaysPastDue
integer属性。应根据
DueDate
datetime属性过去的天数进行计算。该计算是在控制器内部还是直接在视图上进行?从程序上看,那会是什么样子

控制器.cs

 // GET: myController
        [Authorize(Roles = "Admin")]
        public ActionResult Index()
        {
            var myVariable= myData.Include(moreData);
            return View(myVariable.ToList());
        }
View.cshtml

<table class="table">
<tr>
  <th>
    Due Date
  </th>
  <th>
     Days Past Due
  </th>
</tr>

@foreach (var item in Model)
{
     <tr>
       <td>
          @Html.DisplayFor(modelItem => item.DueDate)
       </td>
       <td>
          @Html.DisplayFor(modelItem => item.DaysPastDue)
       </td>
     </tr>
}

到期日
逾期天数
@foreach(模型中的var项目)
{
@DisplayFor(modelItem=>item.DueDate)
@DisplayFor(modelItem=>item.DaysPastDue)
}

该计算是在控制器内部进行还是直接在视图上进行
一般来说,控制器和/或模型进行计算。您尽可能希望视图只决定如何显示它接收的数据。仅仅因为您可以编写一组代码来在视图中执行某些操作并不意味着您应该这样做。

此计算是在控制器内部还是直接在视图上执行
一般来说,您的控制器和/或模型进行计算。您尽可能希望视图只决定如何显示它接收的数据。仅仅因为您可以编写一堆代码在视图中执行某些操作并不意味着您应该这样做。

不在视图中执行此日期比较的一个很好的理由是,您不希望确定应用程序行为方式的逻辑分散在应用程序的多个层中。如果此逻辑内置于控制器或模型中,则可以跨多个视图重用。如果它在视图中,并且您需要重新创建视图,则需要重新整合该逻辑

此外,假设您确定您的“过期天数”需要一些特定的逻辑来解释小时、周末等。现在,除了在一个地方有该逻辑外,您还可能希望能够为它编写单元测试。如果逻辑在正确的位置,那么这很容易,但是如果是在视图中,那么就更难了

MVC的一个优点是,您可以编写控制器和模型,然后其他不太熟悉内部逻辑的人可以构建或维护视图。擅长让页面看起来很棒的UI开发人员不必担心弄乱“过期天数”逻辑

甚至可以说,避免直接引用
DateTime.Now
,因为这会增加测试的难度。每次创建测试数据时,都必须根据当前日期/时间调整日期。通常最好插入如下接口:

public interface IDateTimeProvider
{
    DateTime Now { get; }
}
public class DateTimeProvider : IDateTimeProvider
{
    public DateTime Now => DateTime.Now;
}
您的具体实现可能如下所示:

public interface IDateTimeProvider
{
    DateTime Now { get; }
}
public class DateTimeProvider : IDateTimeProvider
{
    public DateTime Now => DateTime.Now;
}
但在测试时,您可以使用类似的

不在视图中进行此日期比较的一个很好的原因是,您不希望确定应用程序行为方式的逻辑分散在应用程序的多个层上。如果此逻辑内置于控制器或模型中,则可以跨多个视图重用。如果它在视图中,并且您需要重新创建视图,则需要重新整合该逻辑

此外,假设您确定您的“过期天数”需要一些特定的逻辑来解释小时、周末等。现在,除了在一个地方有该逻辑外,您还可能希望能够为它编写单元测试。如果逻辑在正确的位置,那么这很容易,但是如果是在视图中,那么就更难了

MVC的一个优点是,您可以编写控制器和模型,然后其他不太熟悉内部逻辑的人可以构建或维护视图。擅长让页面看起来很棒的UI开发人员不必担心弄乱“过期天数”逻辑

甚至可以说,避免直接引用
DateTime.Now
,因为这会增加测试的难度。每次创建测试数据时,都必须根据当前日期/时间调整日期。通常最好插入如下接口:

public interface IDateTimeProvider
{
    DateTime Now { get; }
}
public class DateTimeProvider : IDateTimeProvider
{
    public DateTime Now => DateTime.Now;
}
您的具体实现可能如下所示:

public interface IDateTimeProvider
{
    DateTime Now { get; }
}
public class DateTimeProvider : IDateTimeProvider
{
    public DateTime Now => DateTime.Now;
}
但在测试时,您可以使用类似的


if(DateTime.Now>DueDate.AddDays(DaysPastDue))
if(DateTime.Now>DueDate.AddDays(DaysPastDue))
?感谢您的详细回答。我怀疑这个逻辑应该在控制器中完成,但你的回答确实指出了原因。谢谢你的详细回答。我怀疑这个逻辑应该在控制器中完成,但你的回答确实指出了原因。完成我的想法——为控制器或模型编写单元测试(通常)相当容易。对于一个视图来说,可能是的,但它已经超出了我对easy.Finishing的定义——为控制器或模型编写单元测试(通常)相当容易。对于一个视图来说,可能是的,但它已经超出了我对easy的定义。