【问题标题】:ASP.NET MVC3: Force controller to use date format dd/mm/yyyyASP.NET MVC3:强制控制器使用日期格式 dd/mm/yyyy
【发布时间】:2011-12-12 13:04:58
【问题描述】:

基本上,我的日期选择器使用英国格式dd/mm/yyyy。但是当我提交表单时,ASP.net 显然使用的是美国格式。 (仅接受小于 12 的天数,即认为它是月份。)

 public ActionResult TimeTable(DateTime ViewDate)

有没有办法强制它以某种方式识别?

奇怪的是,其他插入方法似乎可以识别正确的格式。

“参数字典包含一个空条目,用于Mysite.Controllers.RoomBookingsController 中的方法System.Web.Mvc.ActionResult Index(System.DateTime) 的非可空类型System.DateTime 的参数ViewDate。可选参数必须是引用类型、可空类型或已声明作为可选参数。”

【问题讨论】:

标签: c# asp.net asp.net-mvc-3


【解决方案1】:

阅读this。它很好地解释了正在发生的事情以及它为何如此运作。

我知道使用该网站的每个人都在英国,因此我可以安全地覆盖默认的 DateTime 模型绑定器:

public class DateTimeModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var date = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue;

        if (String.IsNullOrEmpty(date))
            return null;

        bindingContext.ModelState.SetModelValue(bindingContext.ModelName, bindingContext.ValueProvider.GetValue(bindingContext.ModelName));
        try
        {
            return DateTime.Parse(date);
        }
        catch (Exception)
        {
            bindingContext.ModelState.AddModelError(bindingContext.ModelName, String.Format("\"{0}\" is invalid.", bindingContext.ModelName));
            return null;
        }
    }
}

【讨论】:

  • 通读所提供的,对于不同的情况更有意义。这篇文章立即调用了格式不同的视图。其他帖子存储到数据库的位置。并因此被正确识别。
  • 好的,那么我将把这段代码放在哪里/我将如何引用它,以供使用。干杯
  • 我在 Binders 目录中的自己的文件中有上面的代码。然后,您需要在 Application_Start() 中使用 ModelBinders.Binders.Add(typeof(DateTime), new DateTimeModelBinder()) 之类的东西注册活页夹
  • 您的代码不断地反转日期时间。所以它是英国,然后是美国,然后是英国等等等。嗯 - 它不能解决显示问题。很明显,美国和英国的冲突仍在使用,造成了奇怪的效果。我正在使用addday(1),它一直在反转。
  • 终于可以添加cmets了。考虑使用 DateTime.TryParseExact(),您可以在此处指定您的 DateTime 格式(“{0:dd/MM/yyyy}”
【解决方案2】:

您需要为 DateTime 使用自定义 ModelBinder。我和你有同样的问题。

【讨论】:

    【解决方案3】:

    您是否尝试将当前文化设置为 en-GB?

    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
         base.Initialize(requestContext);
    
         CultureInfo cultureInfo = CultureInfo.GetCultureInfo("en-GB");
    
         Thread.CurrentThread.CurrentCulture = cultureInfo;
         Thread.CurrentThread.CurrentUICulture = cultureInfo;                    
     }
    

    【讨论】:

    • 这会去哪里? Global.asax.cs?
    • 有几个地方,我的例子是重写Controller的初始化方法,但是你也可以把它放在View.InitializeCulture或者Global.asax中。看这里; forums.asp.net/p/1521130/3656712.aspx
    • 除非DateTime 来自表单集合,否则这将不起作用。如果它来自查询字符串或路由数据,则忽略文化。
    • 我把它放在我的预订控制器的顶部,但它仍然做同样的事情。 :(
    • 绝对喜欢在 Global.asax.cs 的 Application_BeginRequest() 中添加这个
    【解决方案4】:

    你可以做到:

    • 全局(在 Application_Start() 下的 global.asax 中):

      ModelBinders.Binders.Add(typeof(DateTime), new DateTimeModelBinder()); 
      
    • 对于方法:

          public ActionResult TimeTable([Binder(typeof(DateTimeModelBinder)]DateTime ViewDate)
      
    • 对于自定义模型类 - 啊不,没有可能,因为您使用 struct DateTime ;-)

    啊,抱歉,我无法在 Adams 帖子中添加评论 - 这是基于他的代码。

    【讨论】:

      【解决方案5】:

      基本上,我的日期选择器使用英国格式的 dd/mm/yyyy

      初学者的错误。它应该使用浏览器设置的任何格式。问题不是格式,而是客户端和服务器之间的不同格式。服务器应该发出代码,根据协商的区域设置格式化日期,然后服务器也使用它来解析它。

      但是当我提交表单时,ASP.NET 显然使用的是美国格式。

      不。这就是说,当我吃香料时,它总是盐,然后你总是吃盐。您的服务器接受当前协商的文化 - 除非您修改设置 - 在客户端和服务器之间协商。检查线程当前的文化,什么时候应该进行解析以查看它的设置。

      【讨论】:

      • 好的,所以如果 datetimepicker 使用浏览器设置选项,它仍然会以实际表示的日期时间进入 asp.net 代码,而不管 datetimepickers 格式如何?
      • 取决于你如何编码。也可以来自写得不好的日期时间选择器的字符串。你说“我的日期时间选择器”。修复它;)
      • 哎哟 - 可能完全不了解与服务器协商的设置。检查stackoverflow.com/questions/3870605/… 以查看oyu 必须如何在页面中对其进行初始化;)基本上告诉它使用协商的格式。然后他们匹配。
      • 我目前已覆盖 jquery datetimepicker 以使用英国格式。我的电脑是英式格式,但在 C# 代码后仍显示为美式。即使有以下覆盖。 :( 我仍然不知道如何解决它。
      【解决方案6】:

      从我的 BindigTools 中绑定 DateTime? (可为空),基于一些书籍样本 - Pro MVC3

          public static DateTime? GetValueNDateTime(ModelBindingContext context, string searchPrefix, string key, string format)
          {
              ValueProviderResult vpr = context.ValueProvider.GetValue(searchPrefix + key);
              DateTime outVal;
              if (DateTime.TryParseExact(vpr.AttemptedValue, format, null, System.Globalization.DateTimeStyles.None, out outVal))
              {
                  return outVal;
              }
              else
              {
                  return null;
              }
          }
      

      它使用精确解析,所以你不应该对解析的日期有任何问题。

      【讨论】:

        猜你喜欢
        • 2021-06-13
        • 2017-10-02
        • 2016-01-02
        • 1970-01-01
        • 1970-01-01
        • 2015-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多