ASP.NET MVC3应用程序创建错误的路由值

时间:2011-11-03 19:46:23

标签: asp.net-mvc-3

好吧,这可能只是我无知,但我的MVC3应用程序中有以下路径:

routes.MapRoute("Directory","{aid}/{controller}/{action}/{year}/{quarter}",
     new { aid = "sf", controller = "Lobbyist", action = "Index", 
     year = CurrentYear(), quarter = CurrentQuarter() });

在我的Global.asax.cs中,我有以下两种方法:

    public static int CurrentQuarter()
    {
        int quarter = 0;
        //...use some internal business logic to determine the value of 
        //'quarter' based on the current date...
        return quarter;
    }

    public static int CurrentYear()
    {
        return DateTime.Now.Year;
    }

此代码始终非常适合 。在某个时间点,在我们的生产环境(运行IIS7)中,当它应该是1,2,3或4时,CurrentQuarter()的路由值变为零值。它在生产中工作得很好,除了那个时间点。 IISRESET'修复'了这个问题。

我所知道的:

  1. 在CurrentQuarter()失败的时候,CurrentYear()仍然是 正确回归
  2. CurrentQuarter()方法没有抛出 将阻止设置'quarter'变量的异常
  3. 驱动CurrentQuarter()方法的业务逻辑有效 对于DateTime.MinValue和DateTime.MaxValue
  4. 之间的每个日期

    我的问题真的归结为:

    • 调用静态方法来生成路由值是不是很难?
    • 应用程序是否有可能“忘记”静态方法的结果,并导致它返回垃圾值?应用程序池可以循环使用吗?

    我在这里抓住稻草!

    感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

我不会在这里调用静态值。我完全不同意以上的伊戈尔。它不标准,很难追踪这些值来自不知道应用程序的人。从控制器调用它,或者甚至更好 - 控制器调用的服务层(即业务逻辑)获取此值。

路由目的不是调用业务方法。

关于第二个问题,如果有应用程序池回收,则只会重置该值。但是,如果多个线程调用此方法并可能在同一方法中更改值,我将在其中实现一些锁定以防止更新重叠。

答案 1 :(得分:0)

您应该将路径值year和quarter设置为可选,并在Action方法中为它们提供默认值。我认为这使得一切都更清洁,更容易维护。

public class LobbyistController
{
   public ActionResult Index(int? year, int? quarter)
   {
     if (!currentYear.HasValue) 
     {
       currentYear = GetCurrentYear();
     }

     if (!currentQuarter.HasValue)
     {
       currentQuarter = GetCurrentQuarter();
     }

     // the rest
    }
}