2011-03-30 59 views
2

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

回答

0

当我不得不在过去这样做的时候,我使用了一个带有“Enter Location”标签的字段的文本框,然后在下面有一个标签,如“Or select ..” 。“,然后使用下拉列表的onChange事件来填充文本框。现在您不验证下拉菜单。

您甚至可以在文本框旁边放置一个“选择”链接,并在点击链接之前隐藏下拉框。缺点是我们最终可能会在圣地亚哥,圣地亚哥和桑地亚都进入地点列表......但是那么您的客户的要求不会让我们明确地阻止这一点。

相关问题