【发布时间】:2012-02-24 10:47:43
【问题描述】:
我有一个控制器 POST 操作,它使用 RedirectToAction 重定向到 GET 方法。
return RedirectToAction(SomeActionName, new { date = someModel.someUTCDate });
我已经实现了一个自定义模型绑定器,它使用假定的文化和时区信息来解析日期,所以我正确地截取了它。我的问题的基本步骤:
- 使用日期/时间字符串调用 POST 操作,如果未另行指定,则为 GMT 标准时间
- 自定义模型绑定器将此日期解析为具有 Utc 种类的 DateTime,并以正确的格式正确绑定到模型
- POST 操作使用 RedirectToAction 重定向到 GET,日期绑定为模型上的 UTC 时间
- 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