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