简体   繁体   English

Kendo树形表在插入操作之前进行检查

[英]Kendo treelist checks before insert operation

I'm trying Kendo MVC treelist with popup editing using template. 我正在尝试使用Kendo MVC树形列表通过模板进行弹出式编辑。

Before inserting a record I'm doing some business rule checks at server-side. 在插入记录之前,我正在服务器端进行一些业务规则检查。 I return these errors from controller with "ModelState.ToDataSourceResult()". 我使用“ ModelState.ToDataSourceResult()”从控制器返回这些错误。
If record does not meet requirements, I want to prevent insert operation. 如果记录不符合要求,我要阻止插入操作。

But I could not be able to find event or property which handles this situation. 但是我找不到能够处理这种情况的事件或属性。

Grid has onReqestEnd event to catch results from controller but TreeList does -not.- 网格具有onReqestEnd事件以捕获控制器的结果,但TreeList可以-不能。

I found a solution for this requirement , 我找到了解决此要求的方法,

Here is sample controller code : 这是示例控制器代码:

    public ActionResult _Create([DataSourceRequest] DataSourceRequest request, Product product)
    {
        //Manually add an model error in order to simulate validation error
        ModelState.AddModelError("Name", "My server error");

        //TODO: implement create functionality

        return Json(ModelState.ToDataSourceResult());
    }

Telerik TreeListDataSource does not expose onRequestEnd event but it can be bound at document.ready : Telerik TreeListDataSource不会公开onRequestEnd事件,但可以将其绑定到document.ready:

 $(document).ready(function () {

        ds = $('#myTreeList').data('kendoTreeList').dataSource;
        ds.bind("requestEnd", onTreeListRequestEnd);

    });

I check operation type for ajax request end and call error handler function: 我检查ajax请求结束的操作类型并调用错误处理程序函数:

function onTreeListRequestEnd(e) {

    if (e.type == "create" || e.type == "destroy") {
        onTreeListError(e.response);
    }

}

Defined error message template : 定义的错误消息模板:

<script type="text/kendo-template" id="message">
<div class="k-widget k-tooltip k-tooltip-validation k-invalid-msg field-validation-error" style="margin: 0.5em; display: block; " data-for="#=field#" data-valmsg-for="#=field#" id="#=field#_validationMessage">
    <span class="k-icon k-warning"> </span>#=message#<div class="k-callout k-callout-n"></div>
</div>
</script>

Displayed error message : 显示的错误信息:

<script type="text/javascript">
var validationMessageTmpl = kendo.template($("#message").html());

function onTreeListError(args) {
    if (args.Errors) {
        var treeList = $("#myTreeList").data("kendoTreeList");
        treeList.one("dataBinding", function (e) {
            e.preventDefault();   // cancel treeList rebind if error occurs

            for (var error in args.Errors) {
                showMessage(treeList.editor.editable.element, error, args.Errors[error].errors);
            }
        });
    }
}

function showMessage(container, name, errors) {
    //add the validation message to the form
    //if multiple messages exists at ModelState concat them
    errMessage = "";
    for (var i = 0; i < errors.length; i++){
        errMessage = errMessage.concat("\r");
        errMessage = errMessage.concat(errors[i]);
    }
    container.find("[data-valmsg-for=" + name + "],[data-val-msg-for=" + name + "]")
                    .replaceWith(validationMessageTmpl({ field: name, message: errMessage }))
}
</script>

I got help from Telerik MVC Grid question : http://www.telerik.com/forums/kendo-grid-edit-mode-popup---error-handling 我从Telerik MVC网格问题获得了帮助: http : //www.telerik.com/forums/kendo-grid-edit-mode-popup---错误处理

and this sample project : Handling server-side validation errors during pop-up editing 和此示例项目: 在弹出编辑期间处理服务器端验证错误

Hope this helps someone.. 希望这对某人有帮助。

Thanks T10 for sharing your solution, 感谢T10分享您的解决方案,
With your solution I can use it in Kendo TreeList MVC while creating a Kendo TreeList. 通过您的解决方案,我可以在创建Kendo TreeList的同时在Kendo TreeList MVC中使用它。

@(Html.Kendo().TreeList<YourModel>()
    .Name("TreeList")
    .DataSource(d=> d.Events(e => e.RequestEnd("onTreeListRequestEnd"))
)

Hope this can help someone. 希望这可以帮助某人。

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

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