【问题标题】:formatting datetime on the clients sends default date value on form post在客户端格式化日期时间在表单发布上发送默认日期值
【发布时间】:2015-04-23 18:20:10
【问题描述】:

我正在尝试关注 this example 以正确应用日期时间格式

我有包含日期​​时间属性的视图模型

public class MyViewModel {
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd.MM.yyyy HH:mm:ss}")]
    public DateTime Starting { get; set; }
}

内部视图我有表单

@using (Html.BeginForm(null, null, null, FormMethod.Post, new { @id = "myForm", @name = "myForm" }))
{
    ...   
<div class="form-group">
   @Html.LabelFor(model => model.Starting, htmlAttributes: new { @class = "control-label col-md-2" })
     <div class="col-md-10">
       @Html.EditorFor(model => model.Starting, new { htmlAttributes = new { @class = "dateTimePicker" } })
       @Html.ValidationMessageFor(model => model.Starting, "", new { @class = "text-danger" })
     </div>
</div>
}

在同一页面内的脚本部分

    <script>
       jQuery.validator.addMethod("MyDateTimeFormat", function (value, element) {
            return Date.parseExact(value, "dd.MM.yyyy HH:mm:ss");    
        }, "Please provide correct datetime format!");

        var form = $("#myForm");
        form.validate({
            rules: {
                Starting: { MyDateTimeFormat: true }
            }
        });
        $("#myForm").submit(function () {            
            if (form.valid())
               alert("The form is valid: \n" + Date.parse($("#Starting").val()));
                $("#Starting").val() = Date.parse($("#Starting").val());
            else {
                alert("Valid: " + form.valid());
            }
        });
    </script>

日期格式已正确应用,但在控制器内的HttpPost 操作上提交表单后,我得到MyViewModel.Starting 的默认值01/01/0001 不是在视图中选择的那个。我做错了什么?

编辑: 添加到 Global.asax.cs

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    string cultureName = CultureHelper.GetImplementedCulture("de-DE");
    Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureName);
    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}

【问题讨论】:

  • 这看起来像是文化问题。请确保发送到服务器的数据可以在服务器端进行解析。你应该和 fiddler 一起看看实际传输了什么。在所有情况下,您都应该尝试以中性格式发送信息(即 yyyy-MM-dd HH:mm:ss)
  • 你有什么建议?重点是以这种特定格式格式化日期时间。我是否应该在发送之前即时转换为默认格式,如果是这样的话。谢谢

标签: javascript jquery .net asp.net-mvc


【解决方案1】:

.NET 正在根据当前的文化集解析日期(和数字)。 ASP.NET 中的文化不取决于浏览器文化,而是取决于 ASP.NET 线程运行的文化。因此,如果您想以特定格式传递日期,则(至少)有两种选择:

  1. 将当前线程的文化(或至少是日期格式)设置为特定值。例如(这应该与您的示例相匹配):

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        string cultureName = CultureHelper.GetImplementedCulture("de-DE"); 
        Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureName);
        Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
    }
    

    请从here 中找到CultureHelper,不要忘记添加您支持的语言(参见列表_cultures)。

  2. 创建一个模型绑定器,根据您的需要过滤DateTime 字段。一个例子可以在here找到。

编辑:更新示例

【讨论】:

  • 我尝试添加 System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("de-DE");在将视图模型发送到视图之前的 HttpGet 操作中。没有帮助。能不能说的具体点?
  • 你必须把它放到Application_BeginRequest(例如)。我已经更新了上面的代码示例...
  • 能否请您也发帖和 CultureHelper。谢谢。
  • 呃,抱歉,请查看afana.me/post/aspnet-mvc-internationalization-part-2.aspx(搜索 CultureHelper)。我刚刚从我们的一个应用程序中复制了代码,因此这部分丢失了。
  • 好的,我添加了 CultureHelper。由于我使用的是 mvc5,因此我将您的代码 sn-p 添加到 Application_Start 方法中的 Global.asax.cs 中。没有改变。我应该从 Appliaction_Start 转移到其他地方吗?
猜你喜欢
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多