Привязка сетки кендо к выпадающему списку, столбец отображает «неопределенный», если он не заполнен - PullRequest
0 голосов
/ 02 октября 2019

Кажется, у меня есть уникальная проблема в моей сетке кендо. Я искал везде и пробовал несколько вещей, но не повезло. Мне нужно привязать мой выпадающий список «HoldReason» к сетке кендо, и «HoldReason» всегда будет нулевым или ничего не будет выбрано изначально. В настоящее время моя сетка показывает 'undefined' в этом столбце сетки.

ViewModel:

  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":

  @using System.Collections
  @using Kendo.Mvc.UI


<kendo-dropdownlist name="HoldReasonId" bind-to="ViewBag.HoldReasonId" Auto-Width="true" option-label=" " datatextfield="Text" datavaluefield="Value" value-primitive="true"></kendo-dropdownlist>

Контроллер (это только дваутверждения относительно раскрывающегося списка):

  ViewData["HoldReasonId"] = new SelectList(_context.SysHoldReason.Where<SysHoldReason>(x => x.SiteId == 99 || x.SiteId == _user.SiteId), "HoldReasonId", "HoldReasonTitle");
  ViewData["HoldReasonCollection"] = new SelectList(_context.SysHoldReason.Where<SysHoldReason>(x => x.SiteId == 99 || x.SiteId == _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" }))

Раскрывающийся список работает, и если я выбираю значение, я вижу значение заголовка HoldReason, как я ожидаю, но я просто могуНе могу понять, как исправить «неопределенный» текст, который отображается изначально. И точно так же, если я хочу установить в раскрывающемся меню метку опции (""), раскрывающийся элемент управления показывает проверку, необходимую для HoldReasonId.

1 Ответ

0 голосов
/ 04 октября 2019

Наконец !! Итак, я понял это. Во-первых, 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;
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...