不引人注目的日期时间? MVC4 中的验证

2024-01-02

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

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

I set the UI culture of the current thread to german. The output of the ResX values are in the correct language, so i know there should be no error with the culture., only for the site itself. The error messages are in english, but the site is in german.

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

这是我使用的代码。



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

我认为默认模型绑定程序有问题,因为渲染的 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="" 
  

我将 Jscript 升级到使用 Visual Studio 2012(已安装 SP1)模板创建新的 Mvc 应用程序时附带的源。这没有影响。

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



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

文化模型绑定器是默认绑定器。



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; zh-cn -> 日/月/年; en-us -> 月/日/年

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



   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;
        }
    }
  

为了完整起见,我的文化模型活页夹:



  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://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 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 并不在客户端的所有日期都进行验证,这就是重点。您只需在服务器端设置文化...但是您的文化设置根本不会反映在客户端...至少 Mvc 引擎不会自动执行此操作。在客户端正确处理具有与英语不同的文化的日期和数字的唯一方法是使用能够正确解析所有文化中的日期的 JavaScript 全球化库,并将客户端文化设置为等于服务器端文化,那么您必须正确地重新定义所有验证方法才能使用全球化函数。 请阅读我的博客文章,其中阐明了如何在客户端正确处理全球化:http://www.dotnet-programming.com/post/2011/12/14/Globalization-Validation-and-DateNumber-Formats-in-AspNet-MVC.aspx http://www.dotnet-programming.com/post/2011/12/14/Globalization-Validation-and-DateNumber-Formats-in-AspNet-MVC.aspx

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

最后,在模型绑定器中设置文化是非常低效的,因为模型绑定器是一个递归函数,因此在模型重建过程中调用了数百次,并且文化设置操作不是简单的变量设置操作,而是有一个不可忽略的成本。最好编写一个全局控制器过滤器来处理区域性设置(我总是这样做),这样每个请求只执行一次操作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不引人注目的日期时间? MVC4 中的验证 的相关文章

  • 值类型如何实现引用类型

    我遇到了一个值类型正在实现 ref 的场景 类型 只是想知道这怎么可能 幕后发生了什么 结构体是值类型 接口是引用 类型但结构可以实现接口而不会出现任何错误 有什么想法吗 提前致谢 实际上 它同时以两种不同的方式进行 首先 任何值类型都可以
  • C++ 并行任务的开销

    我有以下简单的功能 include
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • 如何在Unity Inspector中创建多维数组?

    如何在 Unity Inspector 中创建枚举多维数组并使其可序列化 以便我可以从不同的脚本调用它 public enum colors red blue green yellow cyan white purple public in
  • 我如何知道向量的实际最大大小? (不使用 std::vector::max_size)

    在在线课程中 我正在学习向量 在其中一个例子中 他们解释说 std vector max size 应该给我向量可以达到的最大大小 我决定测试一下 include
  • 如何生成可变参数包?

    给定不相关的输入是否可以生成非类型参数包 我的意思是 我想改变这一点 template
  • 为什么这条路线不匹配

    我在获取匹配路线时遇到一些问题 我使用 base 32 编码的 int 作为 Web 应用程序中幻灯片的短链接 每个幻灯片有 5 个不同的版本 我使用首字母来区分每个版本 路由始终匹配 除非 Base 32 编码 int 的第一个字符与指定
  • 用 OpenCL C 编写快速线性系统求解器

    我正在编写一个 OpenCL 内核 它将涉及求解线性系统 目前我的内核太慢了 提高线性系统部分的性能似乎是一个不错的起点 我还应该注意 我并没有尝试使我的线性求解器并行 我正在研究的问题在宏观层面上已经是令人尴尬的并行 以下是我编写的 C
  • 将 std::pair const 转换为 std::pair const 安全吗?

    理论上或实践上 安全吗reinterpret cast a std pair
  • MVC4 - ContextDependentView - 是什么意思?

    我刚刚开始使用 MVC4 我看到的第一个操作方法有一些新内容 我查了一下互联网 找不到任何关于此的信息 public ActionResult LogOn return ContextDependentView 有谁知道 ContextDe
  • 可以通过模板间接访问基类中的私有类型

    我试图在编译时根据类型是否在给定范围内公开可用来选择要使用的类型 最好直接看代码 include
  • 是否自初始化 'A a = a;'允许吗?

    此代码在运行时在复制构造函数中失败 但编译器 MSVS2008 没有发出警告 您能解释一下 最好引用标准 这段代码是否非法或什么 我理解 A a a 永远不应该写在第一位 但我正在寻找理论背景 class A public A p new
  • 在 Linq 查询中使用动态列名称

    foreach Dimension dimensions in Enum GetValues typeof Dimension var r new ReferenceTable dimensions referenceItems List
  • 使用 FromBase64Transform 解码 base64 文件流

    The example https msdn microsoft com en us library system security cryptography frombase64transform 28v vs 110 29 aspx从M
  • 使用左连接获得不适当的输出

    我正在尝试获取变体列表 并且对于每个变体都获取所有subvariants list无论子变体属于何处 特别的Test say 100 这是示例数据 Id TestId SourceSubVariantId TargetSubVariantI
  • C中使用JNI从对象获取对象

    public class Student private People people private Result result private int amount 这是 Java 中类的示例 在C中 我试图获取 学生 中的 人 但失败了
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • SMTP 客户端在 C# 应用程序中显示错误“未采取请求的操作”

    我正在尝试使用 hotmail 帐户设置电子邮件发送应用程序 代码如下所示 MailMessage mail new MailMessage from to mail Subject Proba email mail Attachments
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个

随机推荐

  • 在 Python 运行时创建对象

    当涉及到在运行时创建对象时 我在理解 OOP 概念时遇到了问题 我研究过的所有教育代码都定义了特定的变量 例如 Bob 并将它们分配给一个新的对象实例 鲍勃 人 我现在无法理解的是如何设计一个在运行时创建新对象的模型 我知道我的措辞可能有错
  • 如何计算日出和日落时间(matlab)?

    我需要在 Matlab 中计算日出和日落时间 但我找不到正确 且简单 的方法来做到这一点 我需要得到与以下内容相同的结果 https www esrl noaa gov gmd grad solcalc https www esrl noa
  • 实现 IEnumerable 时遇到问题

    我正在尝试编写自己的 简单的 List 实现 这就是我到目前为止所做的 using System using System Collections Generic using System Linq using System Text na
  • 限制直接 url 下载图像

    我不久前问过这个问题并得到了我认为可行的答案 但我仍然遇到问题 也许这是我做错的事 但我仍然没有这个权利 我想限制对整个目录的访问 该目录中包含图像和 pdf 文件 我需要创建 pdf 文档的链接并将图像嵌入到锚标记中 有人告诉我为此使用标
  • 将多个属性元数据添加到工作流活动中的依赖属性

    我正在 Windows 工作流中构建许多自定义活动 我需要添加一个 DependencyProperty 它可以list该属性的多个值 用户可以在使用活动时选择这些值 例如对或错 我知道如何使用 PropertyMetadata 简单地传递
  • 使用 JavaScript 循环遍历日期范围

    给定两个Date 对象 其中一个小于另一个 我如何在日期之间每天循环 for loopDate startDate loopDate lt endDate loopDate 1 这种循环会起作用吗 但是如何向循环计数器添加一天呢 Thank
  • ngOnInit 中未定义角度异步输入?

    我有一个父组件通过 API 将数据传递给子组件 如下所示 ts private loadData this data this apiService getData html
  • 在 Scala 中实现多级 Java 接口

    我有以下层次结构java for my interface public interface Identifiable
  • 在 ng-click 上调用超出范围的 javascript 函数

    我有一个 javascript 库 其中包含许多有用的函数 我在网站上使用它们来执行各种操作 我知道我无法通过 ng click 访问这些函数 因为这些函数超出了范围 有没有一种方法可以访问它们 而无需声明仅调用库中函数的作用域函数 Her
  • 如何从合并中排除文件?

    我刚刚开始了解 git 目前正在考虑合并 假设我有一个主分支 并创建一个名为子分支的分支 我在子分支上工作并更改了一些文件 现在我想将这个子分支合并到主分支中 git merge child 然而 子分支中有一些文件 也在主分支中 我不想合
  • swig、python 和 wchar_t 问题

    我是 Python C 绑定 swig 的新手 并且已经尝试解决这个问题有一段时间了 我有一个外部 C 库 Example c 我想从 Python 调用它 我阅读了 Swig 教程并能够立即生成包装器 现在的问题是 当我调用 API 时
  • 如何在最新版本的phonegap 2.9.1中找到cordova.jar?

    我下载了最新版本的phonegap 2 9 1 zip 文件 但它不包含 cordova jar 当我在 google 上搜索时 我得到了答案 例如将文件夹导航到 lib android framework 目录和 fire 命令 andr
  • 使用 iPhone X 的自动调整大小蒙版迁移项目

    我们有一些遗留项目仍在使用自动调整大小遮罩 在 iOS 11 和 iPhone X 之前一切都工作正常 随着安全区域布局指南的引入 支持 iPhone X 的最佳解决方案是什么 我们可以将所有带有自动调整大小蒙版的界面转换为使用自动布局 考
  • Jinja 在 HTML 中渲染文本并保留换行符

    我有一个像这样的简单表格 class RecordForm Form notes TextAreaField Notes 我将数据记录为三段 如下所示 para1 para2 para3 在模板中 我想以只读方式查看该记录的内容 不可编辑的
  • 强制 Tampermonkey 延迟运行/执行脚本

    如何强制 Tampermonkey 在 AJAX 加载每个文档后运行 执行脚本 我希望访问脚本中的这些元素并更改它们 但是 尽管我设定了 run at to document end在设置页面中 它在文档未完全加载时执行 而且 它发生在这个
  • 如何解决 Android Studio 中的意外顶级异常

    我有两个项目共享相同的aidl 文件 在第一个项目中 构建在 Eclipse 和 Android Studio 中运行完成 在第二个项目中 构建在 Eclipse 中运行完成 但在 Android Studio 中我看到 Error Tra
  • 如何在水晶报表中编辑现有查询

    我只能在 数据库 gt 显示 SQL 查询 中看到 SQL 查询 如何在水晶报表中编辑它 您正在寻找Edit Command在数据库专家中 请参见下面的屏幕截图
  • 从 Visual Basic 6 中的所有对象上移除焦点

    是否有一种方法可以让用户单击表单本身 并在此过程中从当前拥有它的任何对象 文本框 组合框等 中删除焦点 基本上 焦点可以同时从所有事物上移开吗 将焦点设置到表单本身不起作用 我想过做旧的 将占位符按钮隐藏在另一个对象后面 的技巧 但我真的不
  • Rails:单击下拉选项时提交(通过 AJAX)

    当选择下拉框的选项时 自动提交 AJAX 表单的最简单 最优雅的方法是什么 我正在创建一个管理页面 管理员可以在其中修改用户权限 其中 权限 存储为整数 并且我希望 权限 字段成为一个下拉框 当管理员单击他希望用户拥有的选项 这是我目前正在
  • 不引人注目的日期时间? MVC4 中的验证

    我将 MVC3 解决方案升级到 MVC4 迁移后 验证器被破坏 如果我选择德语作为语言 我的输入日期是 2013年3月20日 我在 MVC4 中收到验证错误 但在 MVC3 中却没有 如果我将格式从 20 03 2013 替换为 20 03