【问题标题】:kendo ui mvc grid editortemplate issuekendo ui mvc 网格编辑器模板问题
【发布时间】:2013-02-19 18:32:28
【问题描述】:

我想做什么:

  1. 我有一个带有 Kendo UI 控件的表单,例如页面前半部分的 DatePicker(s)、Dropdownlist(s)、NumericTextBox(s)

  2. 下半场有一个 Kendo UI MVC Grid 控件

    • 此 Kendo UI Grid 控件有 8 列,其中 2 列具有 Kendo 下拉列表 (EditorTemplate) 和 CheckBox(EditorTemplate)。
    • Kendo UI Grid 控件是 Ajax 绑定。
  3. 当单击保存按钮时,来自 Kendo UI 控件(前半部分)和 Kendo UI 网格控件(后半部分)的所有值一起作为 Json 对象通过“Ajax Post”发送到控制器。

  4. 我正在为上述过程使用模型绑定

问题或我面临的问题:

带有其他 Kendo UI 控件的表单的前半部分正在正确地将它们的值发布到控制器,但是由于 Kendo UI Grid 在发布某些列值时遇到了一些问题

  • Kendo UI Grid 中数据类型为小数的列未发布值

  • EditorTemplate 控件(如 CheckBox 和 kendo 下拉菜单)在选中时会显示下拉列表的值 "[Object Object]" 以及布尔值而不是复选框控件的实际值。

【问题讨论】:

  • 没有代码意味着几乎没有机会获得帮助。
  • 你能添加一些代码吗?
  • @(Html.Kendo().Grid(Model.Products).Name("Products").Editable(editable => editable.Mode(GridEditMode.InCell)) .Columns(columns => { columns.Bound(p => p.Chk).ClientTemplate(""); columns.Bound(p => p.Account).EditorTemplateName("AccountList"); columns.Bound(p => p.ProductID).Hidden(); columns.Bound(p => p.Adjustment).Format("{0:C} "); columns.Bound(p => p.NewBalance).Format("{0:C}"); }) .DataSource(dataSource => dataSource.Ajax().Model(model => { model.Id( p => p.ProductID); }).ServerOperation(false)))
  • 这是 EditorTemplate 代码:@(Html.Kendo().DropDownList() .Name("Account").DataTextField("Text") .DataValueField("Value").BindTo(new List() { new SelectListItem() { Text = "Inv Type1", Value = "1" }, new SelectListItem() { Text = "Inv Type2", Value = "2" } }) .OptionLabel("选择") .SelectedIndex(0)

标签: asp.net-mvc user-interface grid kendo-ui


【解决方案1】:

我怀疑您是否希望将网格作为表单的一部分。通常,网格通过 ajax 进行交互,而不是通过与其他控件一起提交的批处理表单 - 从表单中解开它。仅此一项就可以让您头疼。

上半场:

尝试使用 Kendo().DatePickerFor()、Kendo().DropDownListFor() 等。您不需要通过 .Name() 显式命名这些 Kendo 控件。这将帮助您进行模型绑定。

下半场:

使用十进制以外的其他数据类型。你觉得这很难吗?尝试使用 TimeSpan 类型来表示没有附加日期的时间(成年男子会哭)。

您通常不需要用于布尔值/复选框的 EditorTemplate。只需使用这个技巧(假设您使用的是 Razor,因为您没有留下任何代码)。

columns.Bound(b => b.IsActive).ClientTemplate("<input type='checkbox' ${ IsActive == true ? checked='checked' : ''} disabled />");

您的 Grid DDL 最好的选择是

columns.ForeignKey(b => b.CustodianIdPrimary, Model.Custodians, "Id", "FullName").EditorViewData(new {ProjectId = Model.ProjectId}).EditorTemplateName("CustodianDropDownList");

Model.Custodians 是所有可能项目的列表。然后,您可以将 EditorTemplate 绑定到此列表,或者如果您需要此特定 DDL 中的子集,则进行 ajax 调用以填充,如下所示

@model int
@(Html.Kendo().DropDownList()
    .Name(ViewData.TemplateInfo.GetFullHtmlFieldName(""))
    .DataValueField("Id")
    .DataTextField("FullName")
    .OptionLabel("Unassigned")
    .DataSource(dataSource => dataSource
        .Read(read => read.Action("ReadProjectCustodiansDdl", "SysMaint", new {projectId = ViewData["ProjectId"]}))
    )
)

但这里是剑道提供的例子

@model object       
@(
    Html.Kendo().DropDownListFor(m => m)        
        .BindTo((SelectList)ViewData[ViewData.TemplateInfo.GetFullHtmlFieldName("") + "_Data"])
)

请注意在我的初始列中使用 EditorViewData 参数。ForeignKey,在此示例中用于传递整个列表。

祝你好运!

【讨论】:

  • 感谢您的回答 Trey,非常感谢,但这是我的观点:- 1) 正如我所提到的,要求是将表单数据(其他剑道 ui 控件)与网格数据一起保存作为 ajax 发布。2)这意味着网格将没有编辑器工具栏(网格内没有 CRUD 操作)。3)而且,在我的网格内,必须进行一些计算和验证,当其中一个单元格值已更改。4)为此,我计划刷新网格数据源,该数据源将在客户端动态更新列和页脚,保存时将另存为批处理。
  • 还有一点要补充的是:1)我将网格(第二半)渲染为局部视图
  • 嗨 Trey,我确实有一个场景,我希望网格与表单的其余部分一起回发,因为整个页面需要保存在事务中(包括修改后的网格行)。有没有办法在回发时从网格中获取所有脏数据而根本不需要 ajax?
  • 我是一个成年人,因为试图编辑代表一天中时间的 TimeSpan 而哭泣。我尝试将它映射到我的视图模型中的DateTime,并且只使用格式中的时间部分。在编辑之前一切正常。
  • 您对 TimeSpan 的看法是正确的:D 我最终创建了一个 DateTime 包装器属性,例如 DateTime Date { get { return new DateTime(Time.Ticks); } set { Time = value.TimeOfDay; } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
相关资源
最近更新 更多