0

テンプレートの追加/編集を使用して剣道グリッドに問題があります。追加/編集用の投稿のオブジェクト (ContactEmail) が null で、理由がわかりません。ContactID に値があります。KendoUI Forums & here で同様の問題への回答を見ましたが、私の問題を解決するものは見つかりませんでした。

テンプレートがなくても機能しないため、カスタム テンプレートでは問題ないようです。検証もないので、なぜそれが通らないのかわかりません。Email は基本的に Phone の単なるコピーで、Email オブジェクトを使用するように変更されています。

ビューに 2 つの Kendo Grids があります。以下はそれらのスニペットです。電子メールのみに問題があります:

@model DORIS.POCO.Contact
<div id="phones">
  <h4>Phones</h4>
  <div id="phoneGrid" style="width:500px">
    @(Html.Kendo().Grid<DORIS.POCO.ContactPhone>()
        .Name("kendoContactPhones")
        .Columns(columns =>
        {
            columns.Bound(m => m.Number).Title("Phone").ClientTemplate("#= getFormattedPhone(Number) #");
            columns.Bound(m => m.Category).Title("Type");
            columns.Bound(m => m.DescriptionOf).Title("Description");
            columns.Bound(m => m.PrimaryPhone).Title("Primary").ClientTemplate("<input type='checkbox' disabled='true' #= PrimaryPhone ? checked='checked' :'' # />");
        })
        .Sortable()
        .Selectable(s => s
            .Mode(GridSelectionMode.Single)
            .Type(GridSelectionType.Row)
        )
        .DataSource(d => d
            .Ajax()
            .Model(model => model.Id(m => m.PhoneID))
            .Read(read => read.Action("GetContactPhones", "ContactPhones", new{ id = Model.ContactID }))
            .Create(create => create.Action("KendoPhoneAdd", "ContactPhones", new{ id = Model.ContactID }))
            .Update(update => update.Action("KendoPhoneEdit", "ContactPhones"))
            .Destroy(destroy => destroy.Action("KendoPhoneDelete", "ContactPhones"))
            .Sort(s => s.Add(m => m.PrimaryPhone).Descending())
        )
        .AutoBind(true)
        .ToolBar(toolBar => toolBar.Template("<a id='addPhone' class='k-button k-button-icontext k-grid-add'><span class='k-icon k-add'></span>Add</a><a id='editPhone' class='k-button k-button-icontext k-grid-edit'><span class='k-icon k-edit'></span>Edit</a><a id='deletePhone' class='k-button k-button-icontext k-grid-delete'><span class='k-icon k-delete'></span>Delete</a>"))
        .Editable(e => e.Mode(GridEditMode.PopUp).TemplateName("ContactPhone").Window(w => w.Title("Manage Phone")))
        .Events(e => e.DataBound("toggleBacktoTopButton"))
    )
  </div>
</div>
<div id="emails>">
  <h4>Email</h4>
  <div id="emailGrid" style="width:500px">
    @(Html.Kendo().Grid<DORIS.POCO.ContactEmail>()
        .Name("kendoContactEmails")
        .Columns(columns =>
        {
            columns.Bound(m => m.Email).Title("Email");
            columns.Bound(m => m.DescriptionOf).Title("Description");
            columns.Bound(m => m.PrimaryEmail).Title("Primary").ClientTemplate("<input type='checkbox' disabled='true' #= PrimaryEmail ? checked='checked' :'' # />");
        })
        .Sortable()
        .Selectable(s => s
            .Mode(GridSelectionMode.Single)
            .Type(GridSelectionType.Row)
        )
        .DataSource(d => d
            .Ajax()
            .Model(model => model.Id(m => m.EmailID))
            .Read(read => read.Action("GetContactEmails", "ContactEmails", new{ id = Model.ContactID }))
            .Create(create => create.Action("KendoEmailAdd", "ContactEmails", new{ id = Model.ContactID }))
            .Update(update => update.Action("KendoEmailEdit", "ContactEmails"))
            .Destroy(destroy => destroy.Action("KendoEmailDelete", "ContactEmails"))
            .Sort(s => s.Add(m => m.PrimaryEmail).Descending())
        )
        .AutoBind(true)
        .ToolBar(toolBar => toolBar.Template("<a id='addEmail' class='k-button k-button-icontext k-grid-add'><span class='k-icon k-add'></span>Add</a><a id='editEmail' class='k-button k-button-icontext k-grid-edit'><span class='k-icon k-edit'></span>Edit</a><a id='deleteEmail' class='k-button k-button-icontext k-grid-delete'><span class='k-icon k-delete'></span>Delete</a>"))
        .Editable(e => e.Mode(GridEditMode.PopUp).TemplateName("ContactEmail").Window(w => w.Title("Manage Email")))
        .Events(e => e.DataBound("toggleBacktoTopButton"))
    )
  </div>

以下は、私の ContactEmailsController のコードで、Add Post メソッドのみです。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult KendoEmailAdd([DataSourceRequest] DataSourceRequest request, ContactEmail email, int id)
{
  if (email != null)
  {
    ContactEmail newEmail = new ContactEmail();

    newEmail.DescriptionOf = email.DescriptionOf;
    newEmail.Email = email.Email;
    newEmail.EntityID = id;
    newEmail.PrimaryEmail = email.PrimaryEmail;

    db.ContactEmails.Add(newEmail);
    db.SaveChanges();
  }

  return Json(new[] { email }.ToDataSourceResult(request, ModelState));
}

これは私の ContactEmail クラスです:

public partial class ContactEmail
{
    public int EmailID { get; set; }
    public int EntityID { get; set; }
    public string Email { get; set; }
    public string DescriptionOf { get; set; }
    public bool PrimaryEmail { get; set; }

    public virtual Contact Contact { get; set; }
}

最後に、これは私の ContactEmail 用のエディター テンプレートです。

@model DORIS.POCO.ContactEmail

@Html.HiddenFor(m => m.EmailID)
@Html.HiddenFor(m => m.EntityID)

<div class="editor-label">
  @Html.LabelFor(m => m.Email)
</div>
<div class="editor-field">
  @Html.EditorFor(m => m.Email )
  @Html.ValidationMessageFor(m => m.Email)
</div>

<div class="editor-label">
  @Html.Label("Description")
</div>
<div class="editor-field">
  @Html.EditorFor(m => m.DescriptionOf)
  @Html.ValidationMessageFor(m => m.DescriptionOf)
</div>

<div class="editor-label">
  @Html.Label("Primary Email")
</div>
<div class="editor-field">
  @Html.CheckBoxFor(m => m.PrimaryEmail)
  @Html.ValidationMessageFor(m => m.PrimaryEmail)
</div>

インターネットで解決策を探すなど、かなり長い間これを見てきました。たぶん私は一生懸命探しすぎているのかもしれませんが、答えは非常に簡単です。

この問題に関連するすべてのコードを含めたと思いますが、何か見逃していると思われる場合はお知らせください。追加します。

ありがとう!どんな支援も大歓迎です!

4

2 に答える 2