我正在开发一个严重依赖KendoUI的项目。
业务要求要求我使用带有MVC验证的KendoUI表单元素。
这适用于标准文本框元素,但是当我需要使用Kendo DropDownList widges时,我遇到了MVC验证显示的问题。
我的剑道DDL:
@Html.HiddenFor(m => m.State)
@(Html.Kendo().DropDownListFor(m=>m.SateName)
.HtmlAttributes(new {title = Web.Resource.Resources.State, tabindex = "0", @class = "form-control",})
.OptionLabel(" ")
.Name("StateName")
.AutoBind(true)
.ValuePrimitive(true)
.DataTextField("Text")
.DataValueField("Value")
.DataSource(dataSource =>
{
dataSource.Read(read => read.Action("GetJsonStates", "Account").Data("getSelectedCountryId"));
})
.Value(Model.State)
)
生成的输出:
<span aria-busy="false" aria-readonly="false" aria-disabled="false" aria-owns="StateName_listbox" tabindex="0" aria-expanded="false" aria-haspopup="true" role="listbox" unselectable="on" class="k-widget k-dropdown k-header form-control" title="Province" style="">
<span unselectable="on" class="k-dropdown-wrap k-state-default">
<span unselectable="on" class="k-input"> </span><span unselectable="on" class="k-select">
<span unselectable="on" class="k-icon k-i-arrow-s">select</span>
</span>
</span>
<input style="display: none;" data-role="dropdownlist" class="form-control input-validation-error" data-val="true" data-val-required="The State field is required." id="StateName" name="StateName" title="Province" type="text"></span>
如果仔细查看从KendoUI生成的隐藏输入,您可以看到MVC验证正在向其添加验证错误,而不是下拉列表。
例如。 class =“..input-validation-error”
验证工作正常,但从UI的角度来看,我无法识别出错的字段。在下图中,您可以看到错误样式已应用于所有标准文本框,但未应用于选择列表(即:省和州)。
有没有人为此工作?我坚持这个。
请注意: Kendo验证不是一个选项(业务要求)。 此外,这是一个包含许多表单的大型Web应用程序,因此在此示例中使用一次性JS解决方案是不可行的。
答案 0 :(得分:0)
我有同样的问题,所以我淹没了kendoValidator:
_kendoValidator = $.fn.kendoValidator;
$.fn.kendoValidator = function (options) {
var that = this;
if (options == null) options = {};
var oldvalidate = options.validate;
var validate = function (e) {
that.find('input,textarea,select').each(function () {
var input = $(this);
var datarole = input.attr('data-role');
var invalid = input.hasClass("k-invalid");
var container = input;
if (datarole == 'numerictextbox' || datarole == 'datepicker' || datarole == 'timepicker' || datarole == 'multiselect' || datarole == 'upload') container = input.parent();
else if (datarole != null) container = input.parent().find('span').eq(0);
container.toggleClass('widget-validation-error', invalid);
});
if (oldvalidate != null) $.proxy(oldvalidate, e.sender)(e);
}
options.validate = validate;
return _kendoValidator.call(this, options);
}
和widget-validation-error是css类:
.widget-validation-error {
border: 1px solid #ff0000 !important;
}