1

私はこのモデルを持っています:

public class MainModel 
{
private Guid m_id;
        public Guid Id
        {
            get { return m_id; }
            set { m_id = value; }
        }

        private string m_name;
        public string Name
        {
            get { return m_name; }
            set { m_name = value; }
        }
private ObservableCollection<Foundation> m_foundations;
        public ObservableCollection<Foundation> Foundations
        {
            get 
            {
                if (m_foundations== null)
                    m_foundations= new ObservableCollection<Foundation>();
                return m_foundations;
            }
            set { m_foundations= value; }
        }
}

public class Foundation
{
private ObservableCollection<Worker> m_workers;
        public ObservableCollection<Worker> Workers
        {
            get 
            {
                if (m_workers == null)
                {
                    m_workers = new ObservableCollection<Worker>();
                }
                return m_workers; 
            }
            set { m_workers = value; }
        }
}

public class Worker
{
[HiddenInput(DisplayValue = false)]
        public Guid Id
        {
            get { return m_id; }
            set { m_id = value; }
        }
[DataType(DataType.DateTime), DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
        public DateTime BirthDate
        { get; set; }

}

そして、この MainModel を受け取る partialView があります。

@using (Html.BeginForm("Save", "Controller", FormMethod.Post, new { ReturnUrl = ViewBag.ReturnUrl }))
    {
        @Html.TextBoxFor(m => m.Name)
        @Html.HiddenFor(m => m.Id)
<div id="workers">
@(Html.Kendo().Grid(Model.Foundations[0].Workers)
 .Name("grid")
                .Columns(columns =>
                {
                    columns.Command(command => { command.Edit().Text("Edit"); command.Destroy().Text("Delete"); }).Width(200);
                    columns.Bound(p => p.Name);
                    columns.Bound(p => p.BirthDate).Width(100).Format("{0: dd-MM-yyyy}").EditorTemplateName("BirthDate");
})
.Editable(editable => editable.Mode(GridEditMode.InLine).CreateAt(GridInsertRowPosition.Bottom))
.DataSource(dataSource => dataSource
                    .Ajax()
                    .PageSize(20)
                    .Model(model => model.Id(p => p.Id))
                    .Create(update => update.Action("EditingInline_Create", "Controller"))
                    .Update(update => update.Action("EditingInline_Update", "Controller"))
                    .Destroy(update => update.Action("EditingInline_Destroy", "Controller"))
                    ))
</div>

BirthDate エディタには次のようなものがあります

@model DateTime
@(
    Html.Kendo().DatePickerFor(m=>m).Name("birthDatePicker")
)

モデルはすべてのプロパティと日時で問題ありません。問題は次のとおりです。model.Foundations[0].Workers[].BirthDate には有効な日付がありますが、テンプレート エディターでは最小値モデルの日時が表示されます。

列を編集すると、表示される値は、たとえば 15-03-2006 ではなく 01-01-0001 のようになります。OK 日付を変更しただけですが、[更新] をクリックすると、DateTime の値は常に DateTime.Now になります。EditingInline_Update では、パラメーター 'worker' が BrithDate を DateTime.Now に変更しました...変更した値はどこにもありません。

これはカルチャの書式設定の問題である可能性があることをどこかで読みましたが、彼らが言ったとおりに実行しました: DateModelBinder を作成し、global.asax に登録しましたが、デバッグ時に渡される値は DateTime.Now です...既に変更されています。Web.config では、スレッドの現在のカルチャと UIculture を変更し、kendo.culture を変更し、デバッグでチェックしましたが、すべてが正しいようです。エディターにjavascriptバリデーターを入れました:

$("#birthDatePicker").kendoValidator({
        rules: {
            date: function (input) {
                var d = kendo.parseDate(input.val(), "dd-MM-yyyy");
                return d instanceof Date;
            }
        }
    });

これはtrueを返し、ここで変更したい日付を確認できますが、モデルバインダーに移動すると、どういうわけかDateTime.nowに変更されます

長々と申し訳ありませんが、これは私を夢中にさせています。これがコレクション内にコレクションを持っていることのバグなのか、それとも他に見逃したものがあるのか​​ わかりません。事前にサンクス

4

1 に答える 1

0

プロジェクトの 1 つに MVC kendo-ui グリッドがあり、編集モードの日付で問題なく動作します。あなたのコードとは異なることに気付いたのは、モデルの DateTime プロパティに属性を記述していないことです。私のモデルは単純に次のようになりました。

public class TransactionViewModel
{
    [Key]
    public int TransactionId { get; set; }

    public string Description { get; set; }

    [Required]
    public DateTime TransactionDate { get; set; }

    [Required]
    public decimal Amount { get; set; }
}

グリッドでは、次の方法で列をバインドしました。

columns.Bound(p => p.TransactionDate).Title("Date").Format("{0:yyyy-MM-dd}").EditorTemplateName("TransactionDate");

また、私のエディター テンプレートはあなたのものとは少し異なって見えましたが、あなたが提供したコードは、私のものをあなたのものに置き換えるテストを行ったところ、問題なく機能しました。

@model DateTime?
@(Html.Kendo().DatePicker()
    .Name("TransactionDate")
    .Value(Model == null ? DateTime.Now.Date : ((DateTime)@Model).Date)
)

文化の問題を処理するために、次のコードも追加しました。

@{
    var culture = System.Threading.Thread.CurrentThread.CurrentCulture.ToString();
}
<script src="@Url.Content("~/Scripts/cultures/kendo.culture." + culture + ".min.js")"></script>
<script>
    kendo.culture("@culture");
</script>

次のことを試してみることをお勧めします。

  • モデルの属性を削除して、問題が発生していないことを確認します。すべてが機能しているときに後で追加できます。
  • 別の日付形式を指定するか、日付形式を指定しないでください。1 つの形式を指定し、ユーザーのブラウザが別の形式でレンダリングしたい場合、問題が発生する可能性があります。
于 2013-06-28T07:40:20.133 に答える