6

私は多くの疑問のある質問を見つけましたが、うまくいきました。これを動作させるためのカスタムコードがたくさんあるのですが、それはなぜですか?これは最初からうまくいかないのでしょうか?MVC DateTimeの検証に失敗しました

私は奇妙だと思うものは、IE9では動作しますが、FirefoxとChromeでは動作しません。 FirefoxやChromeで試してみるたびに、「フィールド誕生日は日付でなければなりません」というメッセージが表示されます。

新しいMVC 4 RTMプロジェクトで以下のコードを試してみると、うまく動作しません。すべてのブラウザでDateTime.Nowのデフォルトがdd-MM-yyyy(オランダ)と表示されていますが、FirefoxとChromeで提出することはできません。

グローバル化タグはweb.configに設定されていないので、デフォルトを使用している必要があります。私はオランダから私はクライアントの文化を取得する必要がありますので、私は推測する。

public class RegisterModel 
{ 
    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] 
    //[DataType(DataType.Date)] 
    public DateTime Birthday { get; set; } 
} 

[AllowAnonymous] 
    public ActionResult Register() 
    { 
     RegisterModel vm = new RegisterModel() 
     { 
      Birthday = DateTime.Now 
     }; 
     return View(vm); 
    } 

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Register(RegisterModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // Attempt to register the user 
      try 
      { 
       //WebSecurity.CreateUserAndAccount(model.UserName, model.Password); 
       //WebSecurity.Login(model.UserName, model.Password); 
       return RedirectToAction("Index", "Home"); 
      } 
      catch (MembershipCreateUserException e) 
      { 
       ModelState.AddModelError("", ErrorCodeToString(e.StatusCode)); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

マークアップ

<!-- language: lang-none --> 
@model DateTimeWithDatePicker.Models.RegisterModel 
@{ 
    ViewBag.Title = "Register"; 
} 

<hgroup class="title"> 
    <h1>@ViewBag.Title.</h1> 
    <h2>Create a new account.</h2> 
</hgroup> 

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary() 

    <fieldset> 
     <legend>Registration Form</legend> 
     <ol> 
      <li> 
       @Html.LabelFor(m => m.UserName) 
       @Html.TextBoxFor(m => m.UserName) 
      </li> 
      <li> 
       @Html.LabelFor(m => m.Birthday) 
       @Html.EditorFor(m => m.Birthday) 
      </li> 
     </ol> 
     <input type="submit" value="Register" /> 
    </fieldset> 
} 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+0

が、私は上記のMVCビューの書式を設定する方法がわかりません。 –

答えて

3

問題だったjQueryの検証とローカリゼーション。 jQueryプラグインのメッセージとメソッドのローカリゼーションファイルがあるようです。問題の詳細な説明と解決方法については、私のブログを参照してください。

http://www.locktar.nl/programming/mvc/localization-validation-in-mvc/

編集:私はちょうどすべてのローカライズの問題のリフレッシュ方法と、DateTimeプロパティのためにそれを修正すると新しいブログ記事をリリースし 。私の新しい投稿MVC localization validationを参照してください。

+0

私はhttp://ajax.aspnetcdn.com/ajax/jquery.validate/1.7/localization/methods_nl.jsを使用しました。あなたのリンクに続いて見つかりました。これはIEとFirefoxでは正常に機能しましたが、Chromeではうまく機能しませんでした。 Chromeはhtml5の日付入力をサポートし、その値を "yyyy-mm-dd"の形式で保存します。私はテストを次のように変更しました。if(Modernizr.inputtypes.date){ return true; } else {<オリジナルテスト>} –

+0

1.7を最新バージョンに変更しましたか?それはしばらく前に私はそのブログを書いた。私はちょうどwww.locktar.nlで新しいブログサイトを立ち上げました。 –

1

それは デフォルトを使用する必要がありますので、グローバリゼーションのタグがweb.configファイルに設定されていません。私はオランダから私はクライアントの文化を取得する必要がありますので、私は推測する。

いいえ、それは正しくありません。あなたはオランダから完全に上手くいくことができ、中国の文化を使うようにブラウザを設定しました。あなたがこれを動作させることができない理由は、おそらくFFとChromeでは正しい文化を持っていないからです。

web.configのグローバリゼーション要素にカルチャを指定していないため、ASP.NET MVCは要求ヘッダーのブラウザから送信されたものを使用します。あなたはEN-USカルチャのブラウザを設定している場合たとえば、次のヘッダーは、各要求に沿って設定されます。

Accept-Language:en-US,en;q=0.8 

はここで、これはChromeで設定されている方法は次のとおりです。

enter image description here

だから確認してくださいあなたの希望する言語をリストの先頭に入れてください。あなたはカスタムモデルバインダーを書くことができ結合モデル中にDisplayFormat属性で定義されたものと同じ構文を使用するための信頼性の高い方法をしたい場合は

そして、ここで示したように:https://stackoverflow.com/a/7836093/29407

+0

私の文化はファイアフォックスとクロムが良かったので、それは問題ではありませんでした。問題はFirefoxとChromeでInternet Explorerと同じように動作していなかったjQueryの検証でした。この投稿の回答と私のブログを参照してください詳細に行く。 –

7

私は日付のjQueryの検証関数を変更することによってこの問題を解決することができました。申し訳ありません

<script type="text/javascript"> 

    $(function() { 

    var dateFormat="dd/mm/yy"; // en-gb date format, substitute your own 

    $("#Birthday").datepicker({ 
     "dateFormat": dateFormat 
    }); 

    jQuery.validator.addMethod(
     'date', 
     function (value, element, params) { 
      if (this.optional(element)) { 
       return true; 
      }; 
      var result = false; 
      try { 
       $.datepicker.parseDate(dateFormat, value); 
       result = true; 
      } catch (err) { 
       result = false; 
      } 
      return result; 
     }, 
     '' 
    ); 

}); 

+0

自分のトピックで私の応答を参照してください。私はそれについてのblogpostを作ったhttp://stackoverflow.com/a/12346915/801005 –

+1

この問題を解決しようとするときに私はあなたのブログの投稿を試みた。さまざまな国の多くのユーザーにとって決定的な解決策が必要なときは、その最高のソリューションだと確信しています。しかし、上記のスクリプトは、2分の解決策が必要なときに適しています。多国籍ユーザーベースのローカリゼーションには気を付けません。 – gls123

関連する問題