[英]Disable MVC “must be a number” data type validation for a field
我有一个Telerik MVC组合框,其中包含位置列表。 客户希望最终用户能够直接在列表中输入新位置。
提交表单后,它应该接受一个新值并将其插入到locations表中,并且当然要更新要添加到新插入位置的ID中的记录的LocationID。
阅读以下代码片段
我读过ComboBox确实允许您输入列表中未包含的值,并使用了演示( 此处 )
保存位置的代码,编辑locationID没问题。 我的问题是我的组合框包含一个整数/字符串值对列表,而不是字符串/字符串。 因此,我在代码中遇到的问题是,如果我尝试提交新的位置名称,它将尝试对其进行验证,并说它不是数字。
我需要一种方法来仅针对LocationID字段尝试抑制此验证,但仍要防止出现空值。
BEGIN EDITS
编辑:我确实找到了这篇文章 ,但是正如OP所说的那样,javascript hack不是非常可扩展的,所以我真的想避免它。
编辑:
我最终使用了JavaScript hack,发现了所有可用的方法。 我计划将其封装在方法或属性中,并将其发布为答案。
我发现使用此黑客,如果我使用Telerik()。ScriptRegistrar()。OnDocumentReady()将代码块放置在文档就绪事件中,则它在Firefox或Chrome中不起作用,正确的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>
过去,当我不得不执行此操作时,我为该字段使用了一个文本框,其标签为“输入位置”,然后在其下方的下拉菜单中为标签为“或选择...”,然后使用下拉列表的onChange事件以填充文本框。 现在,您不验证下拉列表。
您甚至可以在文本框旁边放置一个“选择”链接,并隐藏下拉菜单,直到单击该链接为止。 缺点是我们最终可能将San Diego,SanDiego和Sandiego都输入到位置列表中...但是,那么您客户的要求并不能使我们明确地避免这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.