我有一个Telerik MVC ComboBox,其中包含一个位置列表。客户希望最终用户能够直接在列表中输入新位置。
提交表单后,它应该接受一个新值并插入位置表,当然还要更新要添加到新插入位置ID的记录的LocationID。
请阅读下面的代码段
我读过ComboBox允许您输入不在列表中的值,并使用了演示(Here)
保存位置的代码,编辑locationID不是问题。我的问题是我的组合框包含整数/字符串值对的列表,而不是字符串/字符串。因此,我在代码中遇到的问题是,如果我尝试提交新的位置名称,它会尝试验证它并说它不是数字。
我需要一种方法来尝试抑制此验证,仅针对LocationID字段,但仍然可以防止空值。
BEGIN EDITS
编辑:我确实找到了this post,但正如OP所说,javascript hack不是非常可扩展的,所以我真的想避免它。
修改
我最终使用了javascript hack,我发现它的全部功能。我计划将其封装在方法或属性中,并将其作为答案发布。
我发现,如果我使用Telerik()将代码块放在文档就绪事件中,那么在Firefox或Chrome中它无法正常工作.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>
答案 0 :(得分:0)
当我过去必须这样做的时候,我在字段中使用了一个带有“输入位置”标签的文本框,然后在它下方的下拉列表中添加了一个标签,如“或选择...”,然后使用下拉列表的onChange事件填充文本框。现在您没有验证下拉列表。
您甚至可以在文本框旁边放置一个“选择”链接,并在点击链接之前隐藏下拉列表。我们可能最终将圣地亚哥,SanDiego和Sandiego全部输入到位置列表中......但是,您的客户要求不会让我们明确地阻止它。