2

我有一个包含位置列表的 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>
4

1 回答 1

0

当我过去不得不这样做时,我使用了一个带有“输入位置”标签的字段的文本框,然后在其下方使用“或选择...”标签,然后使用用于填充文本框的下拉列表的 onChange 事件。现在您没有验证下拉列表。

您甚至可以在文本框旁边放置一个“选择”链接,并隐藏下拉菜单,直到单击该链接。缺点是我们最终可能会将 San Diego、SanDiego 和 Sandiego 都输入到位置列表中……但是您的客户的要求并没有让我们明确阻止这种情况。

于 2012-04-26T17:33:01.167 回答