0

.NET MVC Web アプリケーションのアクションで暗黙的なバインディングから DateTime を取得しています。問題は、「dd/MM/yyyy」の形式でAjaxを使用してクエリ文字列を送信しているときに、「MM/dd/yyyy」の形式で日付を取得していることです。

これは、POST ではなく GET プロトコルを使用する場合の .NET MVC Binder の既知の問題であることを知っているので、日付を正しい形式に解析するカスタム バインダーを実装しました。コードは次のとおりです。

public class SearchVMBinder:DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        SearchVM result = (SearchVM)base.BindModel(controllerContext, bindingContext);
        try
        {                
            result.Date = DateTime.Parse(result.Date.ToString(),CultureInfo.GetCultureInfo("es-ES"));
        }
        catch(Exception e)
        {
            NLog.LogManager.GetCurrentClassLogger().Error("Error al hacer el Bind específico de SearchVM. ", e);
        }

        return result;
    }
}

しかし、そのコードでは解析は機能せず、何もしません。「01/04/2014 11:37:00」(4 月) のような日付でテストしており、「result.Date」で「04/01/2014 11:37:00」という日付を取得しています。 (1 月)、解析前と解析後。

問題は、「DateTime.Parse」メソッドが日付を正しく解析しないのはなぜですか?

アップデート:

SearchVM のコードは次のとおりです。

[ModelBinder(typeof(SearchVMBinder))]
public class SearchVM
{
    public DateTime Date { get; set; }
    public string StudyCaseNumber { get; set; }
    public string PatientNumber { get; set; }
    public string PatientName { get; set; }
    public string PatientFamilyName { get; set; }
    public string PatientMothersMaidenName { get; set; }
    public string DoctorName { get; set; }
    public string RoomName { get; set; }
    public E_OrderedBy OrderBy { get; set; }

}

そしてここにコントローラーのアクションのヘッダーがあります:

public ActionResult ListSearch(SearchVM searchFilter)

ありがとうございました。

4

4 に答える 4

0

わかりました。何らかの理由で、「Parse」メソッドは受信する DateTime 形式 (「MM/dd/yyyy H:mm:ss」) を適切に解釈しなかったため、「ParseExact」メソッドを使用して指定する必要がありました。

さて、これはスペインの文化情報に最適です:

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        SearchVM result = (SearchVM)base.BindModel(controllerContext, bindingContext);
        try
        {
            if (result != null)
            {
                if (result.NullableDate != null)
                {                                      
                    result.NullableDate = DateTime.ParseExact(result.NullableDate.ToString(), "MM'/'dd'/'yyyy H:mm:ss", new CultureInfo("es-ES"));
                }
            }

        }
        catch(Exception e)
        {
            NLog.LogManager.GetCurrentClassLogger().Error("Error al hacer el Bind específico de SearchVM. ", e);
        }

        return result;
    }
于 2016-05-09T09:40:54.417 に答える
0

どうぞ:

DateTime を UTC 文字列として投稿/送信してみてください: 次のように変換できます。

DateTime startdate = TimeZoneInfo.ConvertTimeToUtc(input.startdate.Value);   //Converting to UTC time from local time

それが役に立てば幸い;)

于 2016-04-27T10:20:42.077 に答える
0

このようなものはうまくいくでしょう

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var testFormat = bindingContext.ModelMetadata.DisplayFormatString;
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (!string.IsNullOrEmpty(testFormat) && value != null)
        {
            DateTime testDate;
            testFormat = testFormat.Replace("{0:", string.Empty).Replace("}", string.Empty);
            // use the format specified in the testFormat attribute to parse the date
            if(DateTime.TryParseExact(value.AttemptedValue, testFormat, new System.Globalization.CultureInfo("es-ES"), DateTimeStyles.None, out testDate);)
            {
                return testDate;
            }
            else
            {
                //if you want allow nulls
                //date = DateTime.Now.Date;
                //return date;

                bindingContext.ModelState.AddModelError(
                    bindingContext.ModelName,
                    string.Format("{0} is an invalid date format", value.AttemptedValue)
                );
            }
        }

        return base.BindModel(controllerContext, bindingContext);
    }
于 2016-04-27T10:21:15.103 に答える
0

あなたのコードは機能しています。

この質問に対するトップの回答を参照してください: DateTime を英語からスペイン語に変換する

あなたが言った:

しかし、そのコードでは解析は機能せず、何もしません。「01/04/2014 11:37:00」(4 月) のような日付でテストしており、「result.Date」で「04/01/2014 11:37:00」という日付を取得しています。 (1 月)、解析前と解析後。

これは、特定の種類の機能しないものです。ロケールの違いの結果です。「es-ES」形式を使用しています。

https://www.bjelic.net/2011/01/26/coding/formatting-date-time-currency-in-various-cultures/

result.Date = 

    DateTime.Parse(result.Date.ToString(),
    CultureInfo.GetCultureInfo("es-ES"));

結果の日付は「01/04/2014 11:37:00」であり、es-ESロケールは dd/MM/yyyy であるため、現在英語を使用しているため、変換が行われます。

于 2016-04-27T10:28:10.010 に答える