我想将验证结果从服务器传递到客户端并显示消息。
没有 KnockOut.js ,这很简单:
Html.ValidationMessageFor
)使用KnockOut时我该怎么办?这里的最佳做法是什么?
我是否需要使用ViewModel返回我的ModelState?如果是,我应该如何将其绑定到我的ValidationMessage占位符?有没有可以使用的插件?
更新1:
我知道如何使用客户端验证库(Ko验证,jQuery验证)这不是我的问题。
我知道如何使用Ajax将模型状态返回给客户端。
问题是:将我的错误列表绑定到UI元素的标准方法是什么?我是否需要迭代我的集合并逐个绑定它们?有没有可以将我的模型状态对象绑定到ui的插件?
(就像你没有使用淘汰赛一样,mvc会照顾它并将它们绑定到你的验证消息持有者身上。)
答案 0 :(得分:0)
我遇到了同样的问题。首先,我尝试实现此解决方案(https://datatellblog.wordpress.com/2015/06/26/client-and-server-validation-with-web-api-and-knockout/),但它没有用。
我的最终解决方案是这样的:
将ModelState转换为JS数组:
var modelState = null;
modelState = @Html.Raw(Json.Encode(ViewData.ModelState.Where(k => k.Value.Errors.Any()).Select(t => new { Key = t.Key, Value = t.Value.Errors.Select(e => e.ErrorMessage) })));
function getModelState() {
return modelState;
}
创建视图模型后,将错误添加到其中:
self.addErrors = function (data, modelState) {
$(data).each(function (dataIndex, dataItem) {
var itemModelState = $(modelState).filter(function (filterIndex) { return stringStartsWith(modelState[filterIndex].Key, "Addresses[" + dataIndex + "]") });
$(itemModelState).each(function (index, item) {
var field = item.Key.split(".")[1];
if (field === "NumberOfPositions") {
$(item.Value).each(function (valueIndex, valueItem) {
var name = item.Key.replace("[", "\\[").replace("]", "\\]").replace(".", "\\.") + "_Error";
$("#" + name).text(valueItem);
$("#" + name).removeClass("field-validation-valid").addClass("field-validation-error").show();
});
}
});
});
};
至少在我的情况下这是有效的。希望它有所帮助。