web-dev-qa-db-ja.com

ASP.NETMVCアプリケーションの日付形式を変更する

日付形式をdd.MM.yyyyに変更する必要があります。 ASP.NET MVCの日付形式がサーバーで期待するものと異なるため、クライアント側の検証エラーが発生します。

ASP.NET MVCの日付形式を変更するために、次のことを試しました。

Web.config:

<globalization uiCulture="ru-RU" culture="ru-RU" />

モデル:

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
public DateTime? ServiceCreatedFrom { get; set; }

エディターテンプレート:

@model DateTime?
@Html.TextBox(string.Empty, (Model.HasValue 
    ? Model.Value.ToString("dd.MM.yyyy")
    : string.Empty), new { @class = "date" })

見る:

@Html.EditorFor(m => m.ServiceCreatedFrom, new { @class = "date" })

Global.asaxでさえ:

public MvcApplication()
{
    BeginRequest += (sender, args) =>
        {
            var culture = new System.Globalization.CultureInfo("ru");
            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = culture;
        };
}

何もうまくいきませんでした。

15
Andrei

以下が機能するはずです。

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
public DateTime? ServiceCreatedFrom { get; set; }

エディタテンプレートで:

@model DateTime?
@Html.TextBox(
    string.Empty, 
    ViewData.TemplateInfo.FormattedModelValue, 
    new { @class = "date" }
)

その後:

@Html.EditorFor(x => x.ServiceCreatedFrom)

EditorFor呼び出しに渡した2番目の引数は、思ったとおりに機能しません。

このカスタムエディターテンプレートの場合、ビューモデルプロパティで形式を明示的に指定したので、web.configの<globalization>要素と現在のスレッドカルチャの影響はありません。現在のスレッドカルチャは、標準テンプレートで使用され、[DisplayFormat]属性でフォーマットをオーバーライドしなかった場合に使用されます。

15
Darin Dimitrov

Global.asaxファイルの現在のカルチャを、アプリケーションレベルで変更できます。たとえば、

using System.Globalization;
using System.Threading;

protected void Application_BeginRequest(Object sender, EventArgs e)
{    
  CultureInfo newCulture = (CultureInfo) System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
  newCulture.DateTimeFormat.ShortDatePattern = "dd-MMM-yyyy";
  newCulture.DateTimeFormat.DateSeparator = "-";
  Thread.CurrentThread.CurrentCulture = newCulture;
}
1
RAVI VAGHELA

最後に this 私が使用したこのdd/mm/yyyy形式を取得するために1つが機能しましたdate = string.Format("{0}/{1}/{2}", Model.Value.Day, Model.Value.Month, Model.Value.Year);

まずSharedfolderにEditorTemplatesフォルダーを作成し、次に_Sharedfolder/EditorTemplates/Datetime.cshtml_に日時エディターテンプレートを作成してから、上記のリンクをたどります。

ビュー

@Html.EditorFor(x => x.ServiceCreatedFrom)

希望は誰かを助けます。

1
stom

問題を特定するための潜在的な支援として、次のことができますか?1。日付をフォーマットしようとしているポイントにブレークポイントを設定します2. VisualStudioのイミディエイトウィンドウなどを使用して

Thread.CurrentThread.CurrentCulture.Name

そうすると、「ru-RU」文化に戻ってくるのでしょうか?

これをデバッグするのを手伝ってくれるのは私だけではないと確信しています。そうは言っても、おそらく私よりも早く誰かが問題をすぐに理解できるでしょう:).

編集:Razorを使用しているように見えるので、日付をフォーマットしようとしている行のビューファイルに直接ブレークポイントを設定できるはずです。

#2を編集:

これを行うためのよりクリーンな方法があるかもしれませんが、フォームデータがdd.MM.yyyyに投稿されている場合は、次のようなカスタムモデルバインダーが必要になる場合があります。

public class CustomModelBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
              // custom bind the posted date    
        }
}

...これは、たとえば、モデルバインダーとして割り当てられます。 Global.asax.csのApplicationStart。

これが役立つと思われる場合はお知らせください。詳しく説明します。

1
sammy34