我已经创建了一个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
)
答案 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");
答案 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])