禁用字段的MVC“必须是数字”数据类型验证

时间:2011-03-30 09:40:26

标签: c# asp.net-mvc telerik-mvc asp.net-mvc-validation

我有一个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>

1 个答案:

答案 0 :(得分:0)

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

您甚至可以在文本框旁边放置一个“选择”链接,并在点击链接之前隐藏下拉列表。我们可能最终将圣地亚哥,SanDiego和Sandiego全部输入到位置列表中......但是,您的客户要求不会让我们明确地阻止它。