6

これに似た質問がいくつかありますが、私の問題を解決するものはありません。

Entity Framework 4.3 を使用して MVC3 アプリに取り組んでいます。ユーザーが Jquery UI datepicker を使用して編集できるようにする予定の英国の日付フィールドがあります (これは、このブログのおかげで機能しました)。

幸いなことに、このブログには、英国形式を使用して日付ピッカーを作成する手順が含まれていますが、EF 検証では、有効な日付形式を入力する必要があることが示されています。奇妙なことに、日付をDBに送信することを妨げません.目立たない検証が開始され、メッセージが表示されます.

現時点では、次のデータ注釈があります。

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

Application_Start()ファイルのメソッドでこれを使用しGlobal.asax.csます:

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

6 に答える 6

4

そうです、問題は jquery validate スクリプトが US dateformat の使用を主張していたことにありました。私は、世界の大部分が 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>
于 2012-04-17T10:28:25.880 に答える
1

実際、私はここでより良い解決策を見つけました.... by #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();
});
于 2012-05-30T11:53:48.613 に答える
1

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

アップデート

明確にした後、この回答が役立ちます

于 2012-04-13T08:49:16.577 に答える
1

mvc3 フレームワーク (jquery-ui-1.8.11.js) に同梱されている jquery ui datepicker のスクリプト バージョンにバグがあると思います。

英国形式で日付を指定した場合 (実際にブログに記載されているように):

$(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>
于 2012-04-13T09:06:19.940 に答える
0

私はちょうど今この問題を抱えていて、理由を突き止めるのに何時間もかかりました。これがあなたの問題だと言っているわけではありませんが、グローバリゼーションの切り替えなどに何時間も費やした後、私のように苦労している人のために、ここに問題を投稿したいと思いました。

とにかく、私のプロジェクトの問題は、実際には私が思っていたものではありませんでした。[DataAnnotationsExtentions.Date]他のブラウザでは正常に機能しているように見えますが、ローカリゼーションに関しては(つまり、英国で12日後の日が必要な場合)、クライアント側の検証をクロームでマックアップするプロパティを装飾しました。それが機能したことを削除するとすぐに

于 2012-04-14T06:47:53.447 に答える