Asp.net mvc 如何使用MVC';在剑道UI上的远程验证';什么是数字文本框?
我遇到了一点麻烦:我有一个页面,其中有一个整数值,应该针对数据库的重复性进行验证,使用MVC的内置TextBoxFor可以很好地工作,但是当我将其更改为Kendo的NumericTextBox以更好地进行输入验证和总体用户友好性时,远程方法永远不会被调用 基本上:Asp.net mvc 如何使用MVC';在剑道UI上的远程验证';什么是数字文本框?,asp.net-mvc,validation,asp.net-mvc-4,kendo-ui,kendo-asp.net-mvc,Asp.net Mvc,Validation,Asp.net Mvc 4,Kendo Ui,Kendo Asp.net Mvc,我遇到了一点麻烦:我有一个页面,其中有一个整数值,应该针对数据库的重复性进行验证,使用MVC的内置TextBoxFor可以很好地工作,但是当我将其更改为Kendo的NumericTextBox以更好地进行输入验证和总体用户友好性时,远程方法永远不会被调用 基本上: [Remote("ValidateDuplicity", "Edital", AdditionalFields = "Year, Id", ErrorMessage = "Code already used")]
[Remote("ValidateDuplicity", "Edital", AdditionalFields = "Year, Id", ErrorMessage = "Code already used")]
public int Code { get; set; }
如果在视图中我使用以下内容,则一切正常:
@Html.TextBoxFor(x => x.Code, new { @class = "k-textbox lt-width-full" })
@Html.ValidationMessageFor(x => x.Code)
但在下一种情况下,验证从未触发:
@Html.Kendo().NumericTextBoxFor(x => x.Code)
@Html.ValidationMessageFor(x => x.Code)
有没有关于我可能遗漏什么的想法
编辑:
如所问,呈现的Html如下所示:
<span class="k-numeric-wrap k-state-default">
<input type="text" class="k-formatted-value k-input" tabindex="0" aria-disabled="false" aria-readonly="false" style="display: inline-block;">
<input data-val="true" data-val-number="The field Numero must be a number." data-val-regex="Número inválido" data-val-regex-pattern="^([0-9]+)$" data-val-remote="Edital já cadastrado" data-val-remote-additionalfields="*.Numero,*.Ano,*.Id" data-val-remote-url="/SAGI/DNIT/Edital/ValidadeDuplicidadeEdital" data-val-required="Campo requerido" id="Numero" name="Numero" type="text" value="457" data-role="numerictextbox" role="spinbutton" class="k-input" aria-valuenow="457" aria-disabled="false" aria-readonly="false" style="display: none;">
<span class="k-select">
<span unselectable="on" class="k-link">
<span unselectable="on" class="k-icon k-i-arrow-n" title="Increase value">
Increase value
</span>
</span>
<span unselectable="on" class="k-link">
<span unselectable="on" class="k-icon k-i-arrow-s" title="Decrease value">
Decrease value
</span>
</span>
</span>
</span>
<input class="k-textbox lt-width-full" data-val="true" data-val-number="The field Numero must be a number." data-val-regex="Número inválido" data-val-regex-pattern="^([0-9]+)$" data-val-remote="Edital já cadastrado" data-val-remote-additionalfields="*.Numero,*.Ano,*.Id" data-val-remote-url="/SAGI/DNIT/Edital/ValidadeDuplicidadeEdital" data-val-required="Campo requerido" id="Numero" name="Numero" type="text" value="457">
增值
递减值
编辑2
然而,当对生成的Html使用TextBox时,如下所示:
<span class="k-numeric-wrap k-state-default">
<input type="text" class="k-formatted-value k-input" tabindex="0" aria-disabled="false" aria-readonly="false" style="display: inline-block;">
<input data-val="true" data-val-number="The field Numero must be a number." data-val-regex="Número inválido" data-val-regex-pattern="^([0-9]+)$" data-val-remote="Edital já cadastrado" data-val-remote-additionalfields="*.Numero,*.Ano,*.Id" data-val-remote-url="/SAGI/DNIT/Edital/ValidadeDuplicidadeEdital" data-val-required="Campo requerido" id="Numero" name="Numero" type="text" value="457" data-role="numerictextbox" role="spinbutton" class="k-input" aria-valuenow="457" aria-disabled="false" aria-readonly="false" style="display: none;">
<span class="k-select">
<span unselectable="on" class="k-link">
<span unselectable="on" class="k-icon k-i-arrow-n" title="Increase value">
Increase value
</span>
</span>
<span unselectable="on" class="k-link">
<span unselectable="on" class="k-icon k-i-arrow-s" title="Decrease value">
Decrease value
</span>
</span>
</span>
</span>
<input class="k-textbox lt-width-full" data-val="true" data-val-number="The field Numero must be a number." data-val-regex="Número inválido" data-val-regex-pattern="^([0-9]+)$" data-val-remote="Edital já cadastrado" data-val-remote-additionalfields="*.Numero,*.Ano,*.Id" data-val-remote-url="/SAGI/DNIT/Edital/ValidadeDuplicidadeEdital" data-val-required="Campo requerido" id="Numero" name="Numero" type="text" value="457">
默认情况下,Jquery验证不适用于隐藏字段。因此,您必须将这段代码放在jquery验证JS引用之后
$.validator.setDefaults({
ignore: ""
});
首先我们需要禁用jQuery验证器的remote
方法,然后通过为kendoValidator
定义一个新的远程规则并使其async:false
,就可以在KendoUI中使用数据val远程url
和ASP.NET MVC的其他属性
$.validator.methods.remote = function () { /* disabled */ };
$("form").kendoValidator({
onfocusout: true,
onkeyup: true,
rules: {
remote: function (input) {
var remoteAttr = input.attr("data-val-remote-url");
if (typeof remoteAttr === typeof undefined || remoteAttr === false) {
return true;
}
var isInvalid = true;
var data = {};
data[input.attr('name')] = input.val();
$.ajax({
url: remoteAttr,
mode: "abort",
port: "validate" + input.attr('name'),
dataType: "json",
type: input.attr("data-val-remote-type"),
data: data,
async: false,
success: function (response) {
isInvalid = response;
}
});
return !isInvalid;
}
},
messages: {
remote: function (input) {
return input.data('val-remote');
}
}
});
当你使用剑道数字文本框时,最终呈现的html是什么样子?@ataravati它现在就在那里。看起来还可以。你能显示标准文本框的生成代码吗?比较可能会发现一个重要的区别。剑道对象大量使用Javascript。可能是用于处理远程验证的内置MVC Javascript无法正确访问该值。剑道文档在这里:您可能需要使用jQuery进行自己的AJAX调用,并使用剑道API访问值。