我有一个包含位置列表的Telerik MVC ComboBox。客户希望最终用户能够直接在列表中输入新的位置。禁用MVC“必须是数字”字段的数据类型验证
提交表单后,它应该接受一个新的值并插入到位置表中,当然还要更新要添加到新插入位置的ID的记录的LocationID。
阅读下面的代码片段
我读过的组合框不会让你在不在列表中的数值输入,以及所使用的演示(Here)
代码保存位置,编辑locationID不是问题。我的问题是,我的组合框包含一个整数/字符串值对列表,而不是字符串/字符串。因此,我在代码中遇到的问题是,如果我尝试提交新的位置名称,它会尝试验证它并说它不是数字。
我需要一种方法来尝试和压制这种验证,只是为LocationID字段,但仍保护空值。
BEGIN EDITS
编辑:我没有找到this post,但是作为OP有说,JavaScript的黑客是不是很可扩展的,所以我真的想避免它。
编辑:
我结束了使用JavaScript的黑客,其所有我发现它的工作原理。我打算将它封装在方法或属性中,并将其作为答案发布。
我发现用这个技巧,它没有在Firefox或Chrome工作,如果我把代码块使用Telerik的()。ScriptRegistrar()的文档准备事件里面。OnDocumentReady()时,正确window.mvcClientValidationmetadata当它到达这个事件时不知何故被清除,尽管元数据最初被正确推入。
为了解决这个问题,我不得不手动将代码放在它自己的脚本块中,正好在窗体关闭标记(这是客户端验证数组的呈现位置)下方。
END EDITS
此外,现在我直接绑定到我的模型,像这样:
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>