2

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

4

4 回答 4

1

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

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

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

于 2012-08-07T12:25:51.897 回答
1

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

于 2012-08-07T12:27:18.550 回答
1

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

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

   return View("GoodView");
}
于 2012-08-07T12:29:29.720 回答
0

对于一次性用例,属性是多余的,但如果您确实需要重用逻辑,那么属性将是理想的。像这样的东西:

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);
    }
}

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

于 2016-11-23T15:53:29.220 回答