我有一个包含位置列表的 Telerik MVC ComboBox。客户希望最终用户能够直接将新位置输入到列表中。
提交表单后,它应该接受一个新值并插入到位置表中,当然,将要添加的记录的 LocationID 更新为新插入位置的 ID。
阅读下面的代码片段
我读过 ComboBox 确实允许您输入不在列表中的值,并使用了演示(这里)
保存位置的代码,编辑 locationID 不是问题。我的问题是我的组合框包含整数/字符串值对的列表,而不是字符串/字符串。因此,我在代码中遇到的问题是,如果我尝试提交一个新的位置名称,它会尝试验证它并说它不是一个数字。
我需要一种方法来尝试抑制此验证,仅针对 LocationID 字段,但仍可防止空值。
开始编辑
编辑:我确实找到了这篇文章,但正如那里的 OP 所说,javascript hack 不是很可扩展,所以我真的想避免它。
编辑:
我最终使用了 javascript hack,这是我发现的所有方法。我计划将其封装在方法或属性中,并将其作为答案发布。
我发现通过这个 hack,如果我使用 Telerik().ScriptRegistrar().OnDocumentReady() 将代码块放在文档就绪事件中,它在 Firefox 或 Chrome 中不起作用,正确的window.mvcClientValidationmetadata在到达时会以某种方式被清除这个事件,即使元数据最初被正确推送。
为了解决这个问题,我不得不手动将代码放在它自己的脚本块中,就在表单结束标记下方(这是呈现客户端验证数组的位置)。
结束编辑
此外,现在我直接绑定到我的模型,如下所示:
public JsonResult Create(MyEntity Model)
我不确定在进行模型绑定时这将如何解决,我猜它可能只是返回一个错误,而且我什至不会到达我的操作方法代码。
所以我想这里的想法是在方法签名中使用 FormCollection,检测非整数 LocationID,插入更新,然后运行 UpdateModel()?当然,欢迎提出更好的建议。
谢谢!
代码片段
模型:
class IntegerValueList
{
public Int16 ID { get; set; }
public string Name { get; set; }
}
var lists = new Dictionary<string, IEnumerable<object>>();
lists["Locations"] = (from record in db.Locations
orderby record.Name
select new IntegerValueList
{
ID = record.LocationID,
Name = record.Name
}).ToList();
控制器:
LocationList = new SelectList(lists["Locations"], "ID", "Name", LocationID);
看法:
<td>
<div class="editor-field">
<%: Html.Telerik().ComboBoxFor(model => model.LocationID)
.BindTo(Model.LocationList)
.Filterable(c => c.FilterMode(AutoCompleteFilterMode.Contains))
%>
<%: Html.ValidationMessageFor(model => model.LocationID, "*") %>
</div>
</td>