asp.net mvc + knockout:显示服务器端逻辑的验证结果

时间:2015-03-28 23:00:30

标签: c# jquery ajax asp.net-mvc knockout.js

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

没有 KnockOut.js ,这很简单:

  1. 调用验证逻辑。
  2. 将验证结果添加到 ModelState
  3. 每件东西都自动挂钩。 (Html.ValidationMessageFor
  4. 使用KnockOut时我该怎么办?这里的最佳做法是什么?

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

    更新1:

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

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

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

    4. (就像你没有使用淘汰赛一样,mvc会照顾它并将它们绑定到你的验证消息持有者身上。)

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。首先,我尝试实现此解决方案(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();
                    });
                }
            });
    
        });
    };
    
  3. 至少在我的情况下这是有效的。希望它有所帮助。