簡體   English   中英

使用ComponentModel.DataAnnotations進行MVC3驗證的英國日期格式(也使用jquery ui datepicker)

[英]MVC3 Validation with ComponentModel.DataAnnotations for UK date format (also using jquery ui datepicker)

我看到有一些類似的問題,但沒有一個能解決我的問題。

我正在使用Entity Framework 4.3開發MVC3應用程序。 我有一個英國日期字段,我計划允許用戶使用Jquery UI datepicker進行編輯(由於這個博客我得到了工作)。

幸運的是,這個博客包含了使用英國格式制作日期選擇器的說明,但是,EF驗證仍然告訴我需要輸入有效的日期格式。 很奇怪,它並沒有阻止我將日期提交給數據庫,只是不顯眼的驗證開始並顯示消息。

目前我有以下數據注釋:

[DataType(DataType.Date)]
public System.DateTime Module_Date { get; set; }

但我也試過添加:

[DisplayFormat(DataFormatString="{0:dd/MM/yyyy}")]

這完全沒有效果。 我希望有人有一個解決方案,因為我不喜歡關閉不引人注意的驗證來停止此錯誤消息。

謝謝

編輯

在@Iridio回答之后,我考慮添加一個模型綁定,實際上從像我這樣讀過它的幾個帖子似乎是正確的做法,但我想出的並沒有效果。 這是我嘗試過的:

public class DateTimeBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        var date = value.ConvertTo(typeof(DateTime), CultureInfo.CurrentCulture);

        return date;
    }
}

Global.asax.cs文件的Application_Start()方法中使用它:

ModelBinders.Binders.Add(typeof(DateTime), new DateTimeBinder());
ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeBinder());

是的,問題在於jquery驗證腳本堅持使用US datefomat。 我將限制自己對世界大多數人使用dd / mm / yyyy這一事實進行適當的咆哮。

無論如何,最終我在一個類似問題的答案的評論中找到了我的困境的答案,作者親切地寫了一篇關於他如何解決這個問題的博客文章

基本上我使用了jquery globalize腳本 ,只是將文化設置為en-GB 我應該提一下,在他的博客中他沒有提到把你指定文化的位置放在哪里,所以我只是在全球化腳本的引用下的頁面中的腳本標簽中插入:

<script src="@Url.Content("~/Scripts/globalize.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/globalize.culture.en-GB.js")" type="text/javascript"></script>
<script type="text/javascript">
    Globalize.culture("en-GB");
    $.validator.methods.date = function (value, element) {
        return this.optional(element) || Globalize.parseDate(value);
    };
</script>

您必須為DateTime類型編寫自己的ModelBinder。

這是我為類似的問題寫的一個活頁夾,但是使用Decimal類型(也許你需要它)。 你應該掌握這個想法,並根據你的需要進行調整

public class DecimalModelBinder : IModelBinder
{
  public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  {
    ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
    ModelState modelState = new ModelState { Value = valueResult };
    object actualValue = null;
    try
    {
      actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture);
    }
    catch (FormatException e)
    {
      modelState.Errors.Add(e);
    }

    bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
    return actualValue;
  }
}

然后在global.asax中注冊你的活頁夾,你就完成了

protected void Application_Start()
{
  AreaRegistration.RegisterAllAreas();
  RegisterGlobalFilters(GlobalFilters.Filters);
  RegisterRoutes(RouteTable.Routes);
  //Here you tell how to hendle the specific type 
  ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
}

UPDATE

澄清后, 這個答案應該有所幫助

我相信jvery ui datepicker的腳本版本中有一個錯誤,該錯誤隨mvc3框架(jquery-ui-1.8.11.js)一起提供。

如果您以英國格式指定日期(實際上是博客說明):

$(document).ready(function () {
    $('.date').datepicker({dateFormat: "dd/mm/yy"});
});

那么jquery-ui-1.8.11.js似乎在驗證日期方面存在問題,並且一直要求提供有效的英國日期(但驗證似乎是隨機的)。 如果您將日期格式更改為“mm / dd / yy”,那么此問題將會消失,但這對英國日期沒有好處。

該問題已在該庫的更高版本中得到解決,因此請下載最新版本(我相信在撰寫本文時為1.8.18)或引用該cdn:

<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js" type="text/javascript"></script>

實際上我在這里找到了一個更好的解決方案...... #fretje

覆蓋jquery日期

我稍微修改了他/她的代碼,以便它仍然可以采用如下的2012年5月30日的日期格式。

$(function () {
    $.validator.addMethod(
        "date",
        function (value, element) {

            //Added to validate dates like 31 May 2012
            if (value.split('/').length === 1) 
                return this.optional(element) || !/Invalid|NaN/.test(new Date(value));

            var bits = value.match(/([0-9]+)/gi), str;
            if (!bits)
                return this.optional(element) || false;
            str = bits[1] + '/' + bits[0] + '/' + bits[2];
            return this.optional(element) || !/Invalid|NaN/.test(new Date(str));
        },
        "Please enter a date in the format dd/mm/yyyy"
    );

    $global.init();
});

我剛剛遇到這個問題,花了我幾個小時來追查原因。 我不是說這是你的問題,而是在花了幾個小時來切換所有事情的全球化等等之后,我想我會在這里發布問題,讓任何像我一樣苦苦掙扎的人。

無論如何,我的項目中的問題實際上並不是我認為的那樣。 我用[DataAnnotationsExtentions.Date]裝飾了這個屬性,事實證明,當涉及到本地化時(即如果你想要在英格蘭的第12天之后的一天),它會破壞Chrome中的客戶端驗證,盡管它似乎工作正常在其他瀏覽器中。 一旦我刪除它,它工作

問題在於,如果你在文本框中放入一個名為“日期”的課程,Chrome就會變得瘋狂,就像在這個博客中所描述的那樣 我有同樣的問題,我只是將類名更改為customDate,它已解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM