【发布时间】:2011-08-10 08:15:48
【问题描述】:
我正在使用 MVC Extensions 中的 Telerik 网格控件。我将其设置为使用控制器上的操作方法通过 AJAX 调用执行选择、插入、更新和删除。我在每一行都有一个编辑命令按钮,它显示一个弹出表单来编辑或创建网格中显示的实体。我还在 EditorTemplates 中为对象类型定义了一个模板。这一切都按预期运行。当我尝试在行中添加删除命令按钮时,问题就来了。它会导致此异常:
模板只能用于字段访问、属性访问、一维数组索引或单参数自定义索引器表达式。
我已经验证这与我正在使用的编辑器模板有关,因为没有一个编辑/删除可以正常工作。我看不到删除命令和编辑器模板如何相互冲突。这是 Telerik 的错误吗?我已经尝试了他们的论坛,但没有任何回复。
代码如下:
this.Html.Telerik().Grid(this.Model.RuleSet.ValueRules)
.Name("ValueRuleGrid")
.DataKeys(keys => { keys.Add<Int64>(r => r.ID); })
.DataBinding(binding => {
binding.Ajax()
.Select(this.Model.AjaxSelectMethod)
.Insert(this.Model.AjaxInsertMethod)
.Update(this.Model.AjaxUpdateMethod)
.Delete(this.Model.AjaxDeleteMethod)
;
})
.Columns(columns => {
columns.Bound(r => r.Section.Name).Title("Section");
columns.Bound(r => r.ItemName).Title("Question Code");
columns.Bound(r => r.Expression);
columns.Bound(r => r.Result);
columns.Command(commands => {
commands.Edit();
// FIX: When this is not commented out
// the page can't be loaded and results in an exception
//commands.Delete();
}).Width(200);
})
.ToolBar(toolbar => {
toolbar.Insert().ButtonType(GridButtonType.ImageAndText);
})
.Pageable(paging => {
paging.PageSize(6);
})
.Editable(editor => {
editor.Mode(GridEditMode.PopUp);
})
.Filterable()
.Sortable(sorting => {
sorting.Enabled(true);
sorting.SortMode(GridSortMode.MultipleColumn);
sorting.OrderBy(t => t.Add(vr => vr.SectionName));
sorting.OrderBy(t => t.Add(vr => vr.ItemName));
sorting.OrderBy(t => t.Add(vr => vr.Result));
})
.Render();
这是编辑器模板:
<script type = "text/javascript">
function onChange_SectionName(e) {
var sectionName = $("#SectionName").data("tAutoComplete").value();
var itemName = $('#ItemName').data('tAutoComplete');
itemName.value("");
if (sectionName.length > 0) {
itemName.ajax.selectUrl =
'<%:
this.Url.Action("GetSectionItemNames", "Scoring")
%>?sectionName=' + sectionName;
$('#ItemName').attr("disabled", "");
}
else {
$('#ItemName').attr("disabled", "disabled");
}
}
</script>
<table>
<tr>
<td>Section:</td>
<td><%: this.Html.HiddenFor(vr => vr.ID) %>
<% this.Html.Telerik().AutoComplete()
.Name("SectionName")
.DataBinding(binding => {
binding.Ajax()
.Cache(true)
.Select("GetSectionNames", "Scoring");
})
.ClientEvents(events => {
events.OnChange("onChange_SectionName");
})
.Filterable(filtering => {
filtering.FilterMode(AutoCompleteFilterMode.Contains);
filtering.MinimumChars(1);
})
.AutoFill(true)
.Multiple(m => m.Enabled(false))
.HighlightFirstMatch(true)
.Render(); %></td>
</tr>
<tr>
<td>Item:</td>
<td><% this.Html.Telerik().AutoComplete()
.Name("ItemName")
.DataBinding(binding => {
binding.Ajax()
.Cache(false)
.Select("GetSectionItemNames", "Scoring", new {
sectionName = ""
});
})
.Filterable(filtering => {
filtering.FilterMode(AutoCompleteFilterMode.Contains);
filtering.MinimumChars(1);
})
.AutoFill(true)
.Multiple(m => m.Enabled(false))
.HighlightFirstMatch(true)
.Render(); %></td>
</tr>
<tr>
<td>Operator:</td>
<td><% this.Html.RenderAction("RuleOperatorComboBox", "Scoring", new {
valueRule = this.Model
}); %></td>
</tr>
<tr>
<td>Value 1:</td>
<td><%: this.Html.TextBoxFor(r => r.Value1) %></td>
</tr>
<tr>
<td>Value 2:</td>
<td><%: this.Html.TextBoxFor(r => r.Value2) %></td>
</tr>
<tr>
<td>Result/Weight:</td>
<td><% this.Html.Telerik().NumericTextBoxFor(vr => vr.Result)
.MinValue(1)
.MaxValue(500)
.DecimalDigits(0)
.Value(1)
.Render(); %></td>
</tr>
</table>
如果我摆脱编辑器模板,Telerik 网格会很好地发挥作用。不幸的是,默认编辑器在生产应用程序中还有很多不足之处。
【问题讨论】:
标签: ajax asp.net-mvc-2 telerik telerik-grid