Наконец !! Итак, я понял это. Во-первых, HoldReasonId требует ошибки. Я связывал этот элемент управления с моделью базы данных для всей кодовой таблицы, идентификатора, заголовка, описания и т. Д. Это также была модель, которая контролировала ввод данных для этой кодовой таблицы, поэтому требовалось значение идентификатора, поэтому я былполучить эту ошибку. Это давало мне подтверждение из модели базы данных SysHoldReason. Я исправил это, создав отдельную модель представления для ViewSysHoldReason, которая содержит только нулевое значение HoldReasonId и строковое значение HoldReasonTitle.
public class ViewSysHoldReason
{
public int? HoldReasonId { get; set; }
public string HoldReasonTitle { get; set; }
}
Затем я обновил свою модель представления PaymentDetailTerm, чтобы использовать ее вместо редактора. модели базы данных всей таблицы кодов, как и прежде.
public class PaymentDetailTerm
{
public PaymentDetailTerm()
{
}
private int? holdReasonId;
private bool holdFlag;
private decimal disbursed;
private ViewSysHoldReason viewSysHoldReason;
//some properties omitted
[Display(Name = "Disbursed")]
[NonNegative]
[DataType(DataType.Currency), DisplayFormat(DataFormatString = "{0:c}")]
public decimal Disbursed
{
get
{
return disbursed;
}
set
{
disbursed = value;
}
}
[Display(Name = "Hold")]
[BoolFieldRequiredWhenInt("HoldReasonId")]
public bool HoldFlag
{
get
{
return holdFlag;
}
set
{
holdFlag = value;
}
}
[Display(Name = "Hold Reason")]
[IDFieldRequiredWhenBool("HoldFlag")]
public int? HoldReasonId
{
get
{
return holdReasonId;
}
set
{
holdReasonId = value;
}
}
[UIHint("HoldReasonEditor")]
public ViewSysHoldReason HoldReason
{
get
{
if (viewSysHoldReason == null || viewSysHoldReason.HoldReasonId == 0)
{
return new ViewSysHoldReason() { HoldReasonId = 0, HoldReasonTitle = string.Empty };
}
else return viewSysHoldReason;
}
set { viewSysHoldReason = value; }
}
}
Последнее свойство выше для HoldReason - это все, что здесь изменилось. Затем я обновил сетку для отображения, как показано здесь:
@(Html.Kendo().Grid<eCLERC.ViewModels.PaymentDetailTerm>(Model.PaymentDetailTerms)
.Name("TermGrid")
.DataSource(ds => ds
.Ajax()
.ServerOperation(false)
.Model(m =>
{
m.Field(d => d.TermTypeTitle).Editable(false);
m.Field(d => d.PayeePartyName).Editable(false);
m.Field(d => d.PayoffBalance).Editable(false);
m.Field(d => d.PeriodicAmount).Editable(false);
m.Field(d => d.UnpaidBalance).Editable(false);
m.Field(d => d.ClerkFeeFlag).Editable(false);
m.Field(d => d.HoldFlag).Editable(true);
m.Field(d => d.HoldReasonId).Editable(true);
m.Field(d => d.HoldReason);
})
)
.Columns(columns =>
{
columns.Bound(e => e.TermTypeTitle).Width(110).Title("Term Type");
columns.Bound(e => e.PayeePartyName).Width(110).Title("Payee");
columns.Bound(e => e.PayoffBalance).Width(110);
columns.Bound(e => e.PeriodicAmount).Width(110); //TODO: Nikki - what is recap amount
columns.Bound(e => e.UnpaidBalance).Width(100);
columns.Bound(e => e.ClerkFeeFlag).Width(100);
columns.Bound(e => e.Disbursed).Width(100);
columns.Bound(e => e.HoldFlag).Width(100);
columns.ForeignKey(p => p.HoldReason, (System.Collections.IEnumerable)ViewData["HoldReasonId"], "Value", "Text")
.EditorViewData(new {HoldReasonId = (System.Collections.IEnumerable)ViewData["HoldReasonId"]})
.EditorTemplateName("HoldReasonEditor").ClientTemplate("#=HoldReason.Value > 0 ? HoldReason.Text : '' #")
.Title("Hold Reason")
.Width(110);
})
.Sortable()
.Editable(editable => editable.Mode(GridEditMode.InCell))
.Events(x => { x.Save("function(e){onGridSave(e)}"); x.CellClose("function(e){onCellClose(e)}"); })
.Scrollable()
.HtmlAttributes(new { style = "height:350px" }))
Обратите внимание, что я добавил событие для CellClose. Это потому, что я хотел поймать редактор, когда пользователь выбрал optionlabel = "", чтобы удалить HoldReason из сетки. Я не мог понять, как установить это значение обратно пустым после того, как пользователь выбрал значение из раскрывающегося списка, поэтому CellClose был моим решением для этого.
function onCellClose(e) {
var grid = $("#TermGrid").data("kendoGrid");
var fieldName = grid.columns[e.container.index()].field;
if (fieldName == "HoldReason" && e.container.find("input").val() == "") {
e.model.HoldReasonId = 0;
e.model.HoldReason.Value = 0;
e.model.HoldReason.Text = "";
}
}
Модель не будет установлена правильно безСобытие onGridSave, хотя я чувствую, что должен показать и этот код. Я не поделился этим на своем оригинальном посте.
function onGridSave(e) {
e.preventDefault();
var grid = $("#TermGrid").data("kendoGrid");
var fieldName = grid.columns[e.container.index()].field;
if (fieldName == "HoldReason") {
$('#HoldReasonCollection').data('kendoDropDownList').value(e.container.find("input").val());
e.model.HoldReasonId = e.values["HoldReason.HoldReasonId"];
e.model.HoldReason = $('#HoldReasonCollection').data('kendoDropDownList').dataItem();
}
if (fieldName == "Disbursed") {
e.model.Disbursed = e.container.find("input").val();
}
if (fieldName == "HoldFlag" && e.model.HoldFlag == true) {
e.model.HoldFlag = false;
}
else if (fieldName == "HoldFlag" && e.model.HoldFlag == false) {
e.model.HoldFlag = true;
}
}