ASP.NET MVC 3 根据一年中的时间/可访问的日期范围限制对视图的访问

本文关键字:访问 时间 日期 范围 视图 MVC NET 一年 ASP | 更新日期: 2024-10-25 09:35:38

我正在使用 ASP.NET MVC 3,带有Razor视图。我在控制器中有两个操作方法(Get 和 Post),它们具有单个相应的视图(.cshtml 文件)。在我的应用程序中,我希望仅在一年中的某些时间允许访问该视图,我们将其称为"可访问日期范围"。在不在可访问日期范围内的所有时间,我希望应用程序向用户提供错误消息,而不是显示页面。解决这个问题的好方法是什么?是否可以在控制器方法上使用自定义属性?逻辑是否应该直接进入两个控制器方法?我应该只在视图文件中使用 if 语句以及适当的逻辑吗?我并不疯狂地将此逻辑放在视图文件中,并且希望获得更简洁的选项的建议。

ASP.NET MVC 3 根据一年中的时间/可访问的日期范围限制对视图的访问

最简单的答案是将逻辑放在控制器中:

public ActionResult SummerOnly()
{
   if (!(DateTime.Now > new DateTime(2012,8,8)))
       return View("Error");    
   return View("GoodView");
}

您可以创建自定义属性,但我更喜欢自己将逻辑放入控制器中。只有当我知道自定义属性是我将在应用程序中一遍又一遍重用的东西时,我才倾向于使用自定义属性。

然后

是一个简单的情况,检查日期是否在特定日期内,然后根据结果触发到不同的视图。

它永远不应该出现在视图中,因为我想你已经从你的问题中知道了。

最简单的方法是将逻辑放在操作方法中。 当然不要在视图中执行此操作,因为这不是视图的责任。 你可以为此创建一个属性,如果你打算重用它,我肯定会走这条路,否则我会保持简单,只将逻辑放在操作方法中。

对于一次性用例,属性是矫枉过正的,但如果你确实需要重用逻辑,那么属性将是理想的。像这样:

public class RestrictDate : ActionFilterAttribute
{
    private int _monthFrom ;
    private int _monthTo;
    private int _dayFrom = 1;
    private int _dayTo = 0;
    public RestrictDate(int monthFrom, int monthTo)
    {            
        _monthFrom = monthFrom;
        _monthTo = monthTo;
    }
    public RestrictDate(int monthFrom, int dayFrom, int monthTo, int dayTo)
        : this(monthFrom, monthTo)
    {
        _dayFrom = dayFrom;
        _dayTo = dayTo;
    }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        DateTime minDate = new DateTime(DateTime.Today.Year, _monthFrom, _dayFrom);
        int interval = _monthFrom <= _monthTo ? _monthTo - _monthFrom : 12 - _monthFrom  + _monthTo;
        DateTime maxDate;
        if (_dayTo == 0)
        {
            maxDate = minDate.AddMonths(interval + 1).AddDays(-1);
        }
        else
        {
            maxDate = new DateTime(DateTime.Today.Year, _monthFrom, 1).AddMonths(interval).AddDays(_dayTo - 1);
        }
        if (DateTime.Today < minDate || DateTime.Today > maxDate)
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "Home",
                action = "Error"
            }));
        }
        base.OnActionExecuting(filterContext);
    }
}

显然,这不是生产就绪的代码 - 没有对输入等的验证,但我想你明白了。