3

Angular JSを使用して、日時と日時が複雑なオブジェクトを使用してサーバーにポストバックする場合はどうなりますか?値は正しくバインドされません。JSON.stringifyを試しましたが無駄になりました。一般的すぎるかもしれませんが、関連する質問を投稿しました。私が本当に知っておく必要があるのは、これらの日付を正しく渡す方法です。現在行っているのは、jsで回避策を使用して日付を変換することですが、それを行わず、Angularで必要な形式で日付を取得するだけです。次に、正しい値を返します。

それらの日時にどのようにバインドしますか?値は正しく?次のコード例とFiddlerの投稿結果をご覧ください。

C#クラス:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime BirthDate { get; set; }
    public DateTime? ApprovedForSomething { get; set; }
}

Angular JSコントローラー:

function PersonController($scope, $http) {
    $scope.getPerson = function () {
        $http.get('../../Home/GetPerson/1').success(function (data) {
            $scope.Person = data;
        });
    }
    $scope.updateApprovedForSomething = function () {
        $http.post('../../Home/UpdatePerson', { person: $scope.Person }).success(function (data) {
            console.log(data);
        });
    }
}

フィドラー投稿:

HTTP / 1.1 200 OK Cache-Control:private Content-Type:application / json; 文字セット= UTF-8サーバー:マイクロソフト-IIS / 8.0 X-AspNetMvc-バージョン:4.0 X-ASPNET-バージョン:4.0.30319 X-、ソースファイル:????= UTF-8 B YzpcdXNlcnNcbmlja1xkb2N1bWVudHNcdmlzdWFsIHN0dWRpbyAyMDEyXFByb2plY3RzXFZhbGlkYXRpb25UZXN0XEhvbWVcR2V0UGVyc29uXDE = = X-Poweredの-BY: ASP.NET日付:2013年1月16日水曜日14:48:34 GMTコンテンツ-長さ:124

{"FirstName": "Bob"、 "LastName": "Smith"、 "BirthDate": "/ Date(695573315098)/"、 "ApprovedForSomething": "/ Date(1358261315098)/"}

これはサーバー側の結果です。日時は、正しくない新しい日時の値と日時にバインドされますか?無効である。

ここに画像の説明を入力してください

4

2 に答える 2

3

誰かがより良い解決策を持っているなら、答えを更新してください。

そこにもっと良い解決策があるかもしれませんが、私がしたことは非常に簡単な回避策です。DateTimeオブジェクトのカプセル化プロパティを文字列に作成し、それをバインディングの目的で使用するだけです。

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime BirthDate { get; set; }
    public DateTime? ApprovedForSomething { get; set; }
    public DateTime BirthDateAsString 
    {
        get { return BirthDate.ToShortDateString();}
        set { DateTime.Parse(value, BirthDate);}
   }
}

httpでは、すべてのオブジェクトが文字列として扱われますが、ASP.NETはモデルバインディング機能を提供するのに十分スマートです。ただし、JavaScriptDateオブジェクトを.NETDateTimeオブジェクトにバインドすることはできません。

于 2013-01-24T20:31:24.097 に答える
2

より堅牢なアプローチは、モデルバインダーを使用して、すべての受信日を処理することです。

public class DateTimeBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var name = bindingContext.ModelName;
        var value = bindingContext.ValueProvider.GetValue(name);
        if (value == null) 
            return null;

        DateTime date;
        if (DateTime.TryParse(value.AttemptedValue, null, DateTimeStyles.RoundtripKind, out date))
            return date;
        else
            return base.BindModel(controllerContext, bindingContext);
    }
}

グローバルASAXを追加します。

var dateTimeBinder = new DateTimeBinder();

ModelBinders.Binders.Add(typeof(DateTime), dateTimeBinder);
ModelBinders.Binders.Add(typeof(DateTime?), dateTimeBinder);
于 2016-01-12T10:56:21.060 に答える