6

多くのsimulairの質問が見つかりましたが、うまく機能しているクリーンなソリューションではありません。これを機能させるためのカスタム コードがたくさんありますが、それはなぜですか? これは最初から機能しないはずですか?

私が奇妙だと思うのは、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")
}
4

3 に答える 3

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;
        },
        ''
    );

});

于 2012-12-20T17:38:29.940 に答える
3

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

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

編集: すべてのローカリゼーションの問題と DateTime プロパティの修正方法を更新した新しいブログ投稿をリリースしました。私の新しい投稿MVC localization validationを参照してください。

于 2012-09-10T07:17:45.670 に答える
1

グローバリゼーション タグは web.config に設定されていないため、既定値を使用する必要があります。私はオランダ出身なので、私が推測するクライアント文化を得る必要があります.

いいえ、それは正しくありません。オランダから来たあなたはまったく問題なく、中国の文化を使用するようにブラウザを設定しています。これが機能しない理由は、おそらく FF と Chrome に正しいカルチャがないためです。

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

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

これを Chrome で構成する方法は次のとおりです。

ここに画像の説明を入力

そのため、希望する言語をリストの最初に置いていることを確認してください。

また、モデル バインド中に属性で定義されたものと同じ構文を使用する信頼できる方法が必要な場合は、次のDisplayFormatようにカスタム モデル バインダーを作成できます: https://stackoverflow.com/a/7836093/29407

于 2012-08-24T08:02:19.083 に答える