【问题标题】:RedirectToAction is swapping day and month on dateRedirectToAction 正在交换日期的日期和月份
【发布时间】:2012-02-24 10:47:43
【问题描述】:

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

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

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

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

在调用 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 是格式不正确的字符串。

【问题讨论】:

  • 您的意思是 SomeActionName 有一个日期作为参数并且该日期没有正确绑定吗?
  • 我的意思是 SomeActionName 有一个日期作为参数,并且我的自定义模型绑定器正在接收一个格式不正确的字符串来绑定这个值。我为 date 参数指定了一个 DateTime 值,它被转换为 MVC 中某个格式不正确的字符串值。
  • 我认为转换是在绑定到您的操作参数之前在 ModelBinder 中完成的。 DefaultModelBinder 类使用不同的区域性设置从请求数据的不同区域执行类型转换。从 URL(路由和查询字符串数据)获得的值使用不区分文化的解析进行转换,但从表单数据获得的值在转换时会考虑文化。

标签: asp.net-mvc-3


【解决方案1】:

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

【讨论】:

  • 你能展示如何覆盖 RedirectToAction 来转换日期类型吗?我遇到了同样的问题,但我找不到如何转换日期类型,同时保持其他类型的默认逻辑不变。
  • 感谢您的提示,我在这里实现了它并且有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 2018-12-24
  • 2020-03-15
  • 2023-03-17
  • 2016-06-26
  • 2011-01-12
  • 1970-01-01
相关资源
最近更新 更多