Asp.net 将剑道网格绑定到dropdownlist,列显示';未定义';未填充时

Asp.net 将剑道网格绑定到dropdownlist,列显示';未定义';未填充时,asp.net,kendo-grid,Asp.net,Kendo Grid,我的剑道格网似乎有一个独特的问题。我到处都找遍了,试过很多东西,但运气不好。我需要将我的“HoldReason”下拉列表绑定到剑道网格,“HoldReason”将始终为空或最初未选择任何内容。当前,我的网格在该网格列中显示“未定义” 视图模型: public class PaymentDetailTerm { public PaymentDetailTerm() { } private int? holdReasonId; private boo

我的剑道格网似乎有一个独特的问题。我到处都找遍了,试过很多东西,但运气不好。我需要将我的“HoldReason”下拉列表绑定到剑道网格,“HoldReason”将始终为空或最初未选择任何内容。当前,我的网格在该网格列中显示“未定义”

视图模型:

  public class PaymentDetailTerm
  {
    public PaymentDetailTerm()
    {
    }

    private int? holdReasonId;
    private bool holdFlag;
    private decimal disbursed;
    private SysHoldReason holdReason;

    //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 SysHoldReason HoldReason
    {
      get
      {
        if (holdReason == null || holdReason.HoldReasonId == 0)
        {
          return new SysHoldReason() { HoldReasonId = 0, HoldReasonTitle = string.Empty };
        }
        else return holdReason;
      }
      set { holdReason = value; }   
    }
}
TemplateEditor“HoldReasonEditor”:

@使用System.Collections
@使用Kendo.Mvc.UI
控制器(这是关于所讨论的下拉列表的唯一两个声明):

ViewData[“HoldReasonId”]=新建选择列表(_context.SysHoldReason.Where(x=>x.SiteId==99 | | x.SiteId==u user.SiteId),“HoldReasonId”,“HoldReasonTitle”);
ViewData[“HoldReasonCollection”]=新建选择列表(_context.SysHoldReason.Where(x=>x.SiteId==99 | | x.SiteId==u user.SiteId),“HoldReasonId”,“HoldReasonTitle”);
我使用HoldReasonCollection作为隐藏字段,以便稍后在网格保存时正确设置信息。SysHoldReason模型包含HoldReasonId和HoldReasonTitle属性(以及更多属性,但我只关心这些属性)

以及在我的视图中定义的剑道网格:

@(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);
    //m.Field(p => p.HoldReason).DefaultValue(ViewData["HoldReasonId"] as eCLERC.Models.DB.SysHoldReason);
  })
  )
  .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.Bound(e => e.HoldReason).EditorTemplateName("HoldReasonEditor").ClientTemplate("#=HoldReason.Text#");
  })
  .Sortable()
  .Editable(editable => editable.Mode(GridEditMode.InCell))
  .Events(x => { x.Save("function(e){onGridSave(e)}"); })
  .Scrollable()
  .HtmlAttributes(new { style = "height:350px" }))
@(Html.Kendo().Grid(Model.PaymentDetailTerms)
.名称(“术语网格”)
.DataSource(ds=>ds
.Ajax()
.ServerOperation(错误)
.Model(m=>
{
m、 字段(d=>d.TermTypeTitle)。可编辑(false);
m、 字段(d=>d.PayePartyName)。可编辑(false);
m、 字段(d=>d.支付余额)。可编辑(false);
m、 字段(d=>d.PeriodicAmount)。可编辑(false);
m、 字段(d=>d.UnpaidBalance)。可编辑(false);
m、 字段(d=>d.ClerkFeeFlag)。可编辑(false);
m、 字段(d=>d.HoldFlag)。可编辑(true);
m、 字段(d=>d.HoldReasonId)。可编辑(true);
m、 字段(d=>d.HoldReason);
//m、 字段(p=>p.HoldReason).DefaultValue(作为eCLERC.Models.DB.SysHoldReason的ViewData[“HoldReasonId”]);
})
)
.列(列=>
{
columns.Bound(e=>e.TermTypeTitle).Width(110).Title(“术语类型”);
columns.Bound(e=>e.payepartyname).Width(110).Title(“收款人”);
columns.Bound(e=>e.PayoffBalance).Width(110);
columns.Bound(e=>e.PeriodicAmount).Width(110);//TODO:Nikki-重述数量是多少
columns.Bound(e=>e.UnpaidBalance).Width(100);
columns.Bound(e=>e.clerkfeefag).Width(100);
列。绑定(e=>e。已支付)。宽度(100);
columns.Bound(e=>e.HoldFlag).Width(100);
columns.Bound(e=>e.HoldReason).EditorTemplateName(“HoldReasonEditor”).ClientTemplate(“#=HoldReason.Text”);
})
.Sortable()
.Editable(Editable=>Editable.Mode(GridEditMode.InCell))
.Events(x=>{x.Save(“函数(e){onGridSave(e)}”);})
.Scrollable()
.HtmlAttributes(新的{style=“height:350px”}))

下拉菜单起作用,如果我选择了一个值,那么我会像预期的那样看到HoldReason标题值,但我就是不知道如何修复最初显示的“未定义”文本。同样,如果我想将下拉列表设置回选项标签(“”),下拉控件将显示HoldReasonId所需的验证。

最后!!所以,我明白了。首先,HoldReasonId必需错误。我将该控件绑定到整个代码表、id、title、description等的数据库模型。这也是控制该代码表的数据条目的模型,因此需要id值,这就是我得到该错误的原因。它给了我来自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" }))
如果没有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;
    }
  }
  @(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" }))
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 = "";
    }
  }
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;
    }
  }