如何获取ModelState.AddModel错误绑定到knockout动态创建的验证范围?

时间:2012-02-03 12:15:39

标签: asp.net-mvc asp.net-mvc-3 jquery-validate knockout.js

我已使用以下代码设置Knockoutjs以动态创建可编辑的值列表:

       var requirementModel = function() {
        var self = this;
        self.requirementtypes = ko.observableArray(@Html.Interpret(Model.requirementtypes));
        self.requirementid = ko.observable(@Html.Interpret(Model.requirementid));
        self.AddRequirementType = function() {
            self.requirementtypes.push({
                requirementtypeid: null,
                number: "",
                requirementid: 0
            });
        };
        self.RemoveType = function(Type) {
            self.requirementtypes.remove(Type);
        };
        self.hookUpValidation = function() {
            $.validator.unobtrusive.parseDynamicContent('.dynamicData');
        };
    };
    var viewModel = new requirementModel();
    ko.applyBindings(viewModel);

使用html:

 <div class="small-box dynamicData"  data-bind="template:{ name: 'requirementType-template', foreach: requirementtypes, afterRender:$root.hookUpValidation }" ></div>
<button data-bind='click: AddType'>Add Type</button>

我已使用stackoverflow建议的代码连接动态数据验证。

当我回发到服务器时(我没有使用JSON只是表单帖子)我可以做更复杂的验证,如果出现故障我可以使用ModelState.AddModelError(“输入字段名称”,“我可怜的傻瓜那个打破了这个“);对于非动态字段,这适用于强类型或@ Html.ValidationMessage(“输入字段名称”)

但是我找不到将服务器端模型错误挂钩到动态内容的方法。

我有与客户端一起使用的span标签,它们完美地工作。但是,在服务器端验证失败并返回页面后,它们不会被挂钩。知道如何实现这个目标吗?

由于

1 个答案:

答案 0 :(得分:4)

我刚刚为我目前的工作项目编写了这个代码。我不能发布代码规则的代码。就像上面的评论所说的那样,并不是一种优雅的方式。我将描述我们用于显示错误消息的步骤。

首先,修改动态生成的html,使每个html具有与MVC3 @ Html.ValidationFor(...)控件等效的代码。接下来,每个动态控件都需要有一个id字段,您可以使用该字段来定位控件以向其添加错误消息。

我采取的步骤是,在控制器收到ajax数据进行验证后开始 -

  1. 验证收到的数据模型

  2. 创建一个类以返回看起来像这样的结果

    Class AjaxResults{
        bool success {get; set;);
        object returnedData {get; set;);
    }
    
  3. 如果模型验证,请返回AjaxResults success = true和returnedData =&#34;验证数据模型&#34;

  4. 如果型号未验证,则

  5. 将所有错误收集到对列表中。其中key = fieldID和value =&#34;错误消息&#34;。
  6. 使用AjaxResults = false和success =&#34;错误列表&#34;

  7. 返回returnedData
  8. 客户收到AjaxResults对象

  9. 如果success = true,则正常处理结果。

  10. 如果success = false,则遍历列表,突出显示包含错误的字段并显示错误消息。

  11. 在最后一步中,您可以使用jquery验证消息显示错误代码。如果你想这样做,那么在jquery.unobtrusive.valiation.js文件中

    1. 添加代码以复制文件中onError方法的功能。
    2. 添加代码以通过错误列表进行交互,调用onError方法来显示消息。请注意,信息存储在错误消息范围的.data属性中。
    3. 您可能需要编写代码以在提交表单时清除所有这些错误。
    4. 这是一个相当长的程序。但代码很容易模块化为可调用的例程。我们目前在生产代码中使用它,在实践中,它成为我们框架代码的一部分。

      希望这有帮助。