gpt4 book ai didi

c# - 不显眼的日期时间? MVC4 中的验证

转载 作者:可可西里 更新时间:2023-11-01 08:42:03 25 4
gpt4 key购买 nike

我将 MVC3 解决方案升级到 MVC4。迁移后,验证器被破坏。

如果我选择德语作为语言,我的输入日期是“20.03.2013”​​。我在 MVC4 中收到验证错误,但在 MVC3 中没有。如果我将格式从“20.03.2013”​​替换为“20/03/2013”​​,它在 MVC4 中有效,但在 MVC3 中无效;-)

我将当前线程的用户界面文化设置为德语。 ResX 值的输出使用正确的语言,所以我知道区域性应该没有错误。,仅针对站点本身。错误消息是英文的,但网站是德文的。

我认为这意味着验证器使用了错误的用户界面文化。

这是我使用的代码。

[Required(ErrorMessageResourceName = "Error_DepartureDate", ErrorMessageResourceType = typeof(Resx.Query))]public DateTime? DepartureDate { get; set; }

我假设默认模型绑定(bind)器有问题,因为呈现的 html 看起来不错:

data-lang="de" data-mindate="3" data-val="true" data-val-required="Bitte geben Sie das gewünschte Reisedatum des Hinflugs ein." id="DepartureDate" name="DepartureDate" tabindex="3" type="text" value="" 

当您使用 Visual Studio 2012(已安装 SP1)模板创建新的 Mvc 应用程序时,我将 Jscript 升级为随附的源代码。这没有影响。

我有一个 CultureModelBinder,它从 Session 中读取当前文化并使用一个小的辅助函数设置文化。

public static void UpdateThreadCulture(CultureInfo culture){  Thread.CurrentThread.CurrentUICulture = culture;            }        

文化模型 Binder 是默认 Binder 。

ModelBinders.Binders.DefaultBinder = new CultureModelBinder();ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeModelBinder());// and many, many more

也许 mvc4 的执行顺序发生了变化导致了问题?

更新:该项目使用 .NET Framework 4.5 作为目标。

更新 2:

我有一个组合框,用户可以在其中选择 16 种不同的语言,每种语言可能都有自己特定的格式。

例如DE-de -> DD.MM.YYYY;en-en -> 日/月/年;zh-cn -> MM/DD/YYYY

我刚刚得到关于设置当前文化的提示,这是它应该正确的证据。验证器失败时不会命中此代码,看起来它发生在客户端。

   public class DateTimeModelBinder : IModelBinder    {        private LogService _log = new LogService();        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)        {                        object result = null;            ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);            if (valueResult != null)            {                try                {                    var stateHandler = new StateHandler(controllerContext.HttpContext.Session);                                        result = valueResult.ConvertTo(typeof(DateTime?), stateHandler.Culture);                                                       }                catch                {                    try                    {                        result = valueResult.ConvertTo(typeof(DateTime?), CultureInfo.InvariantCulture);                    }                    catch (Exception ex)                    {                        _log.Error("DateTimeModelBinder parse exception", ex);                        _log.KeyValue("AttemptedValue", valueResult.AttemptedValue);                                                               }                                    }            }            return result;        }    }

为了完整起见,我的文化模型 Binder :

  public class CultureModelBinder : DefaultModelBinder    {              public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)        {            StateHandler stateHandler = new StateHandler(controllerContext.HttpContext.Session);            Helper.UpdateThreadCulture(stateHandler.Culture);            return base.BindModel(controllerContext, bindingContext);        }            }

更新:也许与这个问题有关联: http://connect.microsoft.com/VisualStudio/feedback/details/705643/a-data-val-date-attribute-is-generated-for-time-fields-in-asp-net-mvc-4

更新:阅读以下文章: http://weblogs.asp.net/scottgu/archive/2010/06/10/jquery-globalization-plugin-from-microsoft.aspx

尝试了以下方法:

按以下顺序加载脚本:

/Scripts/jquery-1.8.3.min.js/Scripts/globalize.js/Scripts/cultures/globalize.cultures.js// and much more other scripts...

添加了调用。输出正确为“DE”。

        var currentLanguage = $("#DepartureDate").attr("data-lang");        alert(currentLanguage);               $.preferCulture(currentLanguage);

对验证者没有影响...

最佳答案

重点是 Mvc3 不会在客户端验证所有日期。您只需在服务器端设置文化……但您的文化设置根本不会反射(reflect)在客户端……至少 Mvc 引擎不会自动执行。使用不同于英语的文化在客户端正确处理日期和数字的唯一方法是使用能够正确解析所有文化中的日期的 javascript 全局化库,并将客户端文化设置为服务器端文化,那么您必须正确地重新定义所有验证方法以使用全局化函数。请阅读我博客中的这篇文章,其中阐明了如何在客户端正确处理全局化:http://www.dotnet-programming.com/post/2011/12/14/Globalization-Validation-and-DateNumber-Formats-in-AspNet-MVC.aspx

此外,请不要将 CurrentCulture 与 CurrentUICulture 混淆 CurrentUICulture 不会影响处理数字或日期的所有方式,只会影响包含区域性特定资源(例如本地化字符串)的资源文件。

最后,在model binder中设置culture是非常低效的,由于model binder是一个递归函数,所以在模型重建的时候会调用几百次,culture的设置操作不是简单的变量设置操作,而是它的成本不可忽略。最好编写一个全局 Controller 过滤器来处理文化设置(我总是这样做),这样每个请求只执行一次操作

关于c# - 不显眼的日期时间? MVC4 中的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13623381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com