RedirectToAction在日期交换日期和月份

时间:2012-02-24 10:47:43

标签: asp.net-mvc-3

我有一个控制器POST操作,使用RedirectToAction重定向到GET方法。

return RedirectToAction(SomeActionName, new {  date = someModel.someUTCDate });

我已经实现了一个自定义模型绑定器,它使用假定的文化和时区信息来解析日期,所以我正确地拦截了这个。我的问题的基本步骤:

  1. 使用日期/时间字符串调用POST操作,如果未另行指定,则为GMT标准时间
  2. 自定义模型绑定器将此日期解析为具有Utc种类的DateTime,并且以正确的格式正确绑定到模型
  3. POST操作使用RedirectToAction重定向到GET,其日期在模型上绑定为UTC时间
  4. MVC3现在正尝试将DateTime字符串值绑定到围绕
  5. 交换的月份和日期

    在调用RedirectToAction和重新绑定GET操作的DateTime值之间的某个地方,正在进行字符串转换,这似乎是在交换月份和日期。

    是否有一种简单的方法可以确保正确的字符串转换发生而不必为每次RedirectToAction调用手动转换它的开销?我真的想知道这个路由值到字符串转换的位置,以及我是否可以影响它来进行正确的字符串转换。

    为了说明我有什么好转,我有一个自定义DateTime模型绑定器

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
    
        if (value == null || string.IsNullOrEmpty(value.AttemptedValue) || value.AttemptedValue == "null")
        {
            return null;
        }
    
        return FormatHelper.ConvertStringFromGMT(value.AttemptedValue);
    }
    

    在重定向上,我发现模型绑定器的value.AttemptedValue是一个格式不正确的字符串。

1 个答案:

答案 0 :(得分:0)

嗯,问题现在已经解决了。据我所知,当MVC获取重定向的路由值时,路径值将使用不变文化转换为查询字符串参数。这只是幕后发生的一些魔力。我对这个问题的解决方案是覆盖控制器方法RedirectToAction和RedirectToActionPermanent(带有RouteValueDictionary的重载)。我遍历RouteValueDictionary并使用定义的文化和时区信息转换此处的任何日期类型。幸运的是,我的所有控制器都已经从自定义基本控制器继承,因此修复很容易实现。