繁体   English   中英

asp.net mvc +淘汰赛:显示来自服务器端逻辑的验证结果

[英]asp.net mvc + knockout: Showing validation result from server side logic

我想将验证结果从服务器传递到客户端并显示消息。

没有KnockOut.js,它非常简单:

  1. 调用验证逻辑。
  2. 将验证结果添加到ModelState
  3. 每件事都会自动勾上。 Html.ValidationMessageFor

使用KnockOut时该怎么办? 最佳做法是什么?

我需要用ViewModel返回我的ModelState吗? 如果是,我应该如何将其绑定到ValidationMessage占位符? 有没有要使用的插件?

更新1:

  1. 我知道如何使用客户端验证库(Ko验证,jQuery验证),这不是我的问题。

  2. 我知道如何使用Ajax将模型状态返回给客户端。

  3. 问题是: 将错误列表绑定到UI元素的标准方法什么? 我需要迭代我的收藏并将它们一一绑定吗? 有没有可以将我的模型状态对象绑定到ui的插件?

(就像您不使用基因剔除,而mvc会处理并将其绑定到验证消息占位符一样。)

我面临着同样的问题。 首先,我尝试实施此解决方案( https://datatellblog.wordpress.com/2015/06/26/client-and-server-validation-with-web-api-and-knockout/ ),但是它没有用。

我的最终解决方案是这样的:

  1. 将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; } 
  2. 创建视图模型后,向其中添加错误:

      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(); }); } }); }); }; 

至少在我看来,这有效。 希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM