如何重用和参数一个Kendo UI网格EditorTemplate(使用ASP MVC)?

时间:2015-05-22 06:38:02

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

我已经创建了一个DropDownList EditorTemplate,用于网格内联编辑成功。现在我想在多个列(相同网格)和/或具有不同网格的不同视图中重用此模板。

到目前为止我想到的是,如果我省略了模板中下拉列表的“名称”,那么模板会自动绑定到该列中引用它的列(使用.EditorTemplateName(...))。然而,还有其他事情应该参数化(显式或隐式)首先是下拉数据源。

问:在一个网格中有多个下拉列表,如何参数化下拉数据源以防止复制和粘贴DropDownListTemplate.cshtml zillon次?

问:一般情况下,如何在多列和多个视图中使用时如何参数此模板?

观点:

@(Html.Kendo().Grid<Enumeration>()
    .Name("grid")
    .Columns(columns =>
    {
        columns.Bound(e => e.Locale).Width(200)
            .EditorTemplateName("DropDownListTemplate");
        // columns.Bound(e => e.OtherColumn).Width(200)
        //    .EditorTemplateName("DropDownListTemplate", ???);

...和名为DropDownListTemplate.cshtml的模板放在/ Views / Shared / EditorTemplates

@model string
@(Html.Kendo()
  .DropDownListFor(m => m)
  .BindTo(ViewBag.LocaleDropDownListDataSource) // <- Having many dropdown in one grid, how to parameterize this, without copy and paste the DropDownListTemplate.cshtml zillon times?
  //.OptionLabel("Select Locale")
  .DataValueField("Locale")
  .DataTextField("Value")
  //.Name("Locale") // Omitting this binds the template automatically to the referring column in the grid. Using a custom .Name, what is not a column name in the grid ruins the working
  )

2 个答案:

答案 0 :(得分:3)

为什么你必须重新发明轮子,剑道已经为我们GridForeignKey列提供了数十亿次的使用。

模板代码

@model object

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

在Grid中实现

columns.ForeignKey(col => col.DepartmentId, (IEnumerable) ViewBag.Departments, "Value", "Text").Title("Department");

Demo

答案 1 :(得分:2)

Dion的回答确实是正确的,因为在外键(和类似的)情况下,他解释了解决方案,所以我将其标记为答案。

尽管如此,一般的问题如何参数和编辑器模板仍然是一个实际的问题,需要回答。构建器中的EditorViewData()命名非常自我解释。 (好吧,你发现它之后......: - )

观点:

@(Html.Kendo().Grid<Enumeration>()
    .Name("grid")
    .Columns(columns =>
    {
        columns.Bound(e => e.AnyColumn).Width(200)
            .EditorTemplateName("ReusableTemplate")
            .EditorViewData(new {AnyParameterName = anyValue1, OtherParameterName = otherValue1});
        columns.Bound(e => e.OtherColumn).Width(200)
            .EditorTemplateName("ReusableTemplate")
            .EditorViewData(new {AnyParameterName = anyValue2, OtherParameterName = otherValue2});

...和模板名为ReusableTemplate.cshtml并放在/ Views / Shared / EditorTemplates

@model object

@{
    // Access the actual parameter values anywhere including the kendo helpers below (if any) via ViewData:
    var any = ViewData.AnyParameterName
    var other = ViewData.OtherParameterName
}

@(Html.Kendo()
  .AnyHelperYouWant_or_NoHelperAtAll
  )

例如:

@(Html.Kendo().Grid<Enumeration>()
    .Name("grid")
    .Columns(columns =>
    {
        columns.Bound(e => e.AnyColumn).Width(200)
            .EditorTemplateName("ReusableTemplate")
            .EditorViewData(new {Name = "list1");
        columns.Bound(e => e.OtherColumn).Width(200)
            .EditorTemplateName("ReusableTemplate")
            .EditorViewData(new {Name = "list2"});

并使用它:

@model object

@{
    // Access the actual parameter values:
    // Note: You can inline this variable if you want
    var name = ViewData.Name;
}


@(Html.Kendo().DropDownListFor(m => m).BindTo((SelectList)ViewData[name])