یکپارچه سازی سیستم اعتبارسنجی ASP.NET MVC با Kendo UI validator
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: سه دقیقه

روش پیش فرض اعتبارسنجی برنامه‌های ASP.NET MVC، استفاده از دو افزونه‌ی jquery.validate و jquery.validate.unobtrusive است.
    <script src="~/Scripts/jquery.validate.min.js" type="text/javascript"></script>
    <script src="~/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
کار اصلی اعتبارسنجی، توسط افزونه‌ی jquery.validate انجام می‌شود و فایل jquery.validate.unobtrusive صرفا یک وفق دهنده و مترجم ویژگی‌های خاص ASP.NET MVC به jquery.validate است.


عدم سازگاری پیش فرض jquery.validate با بعضی از ویجت‌های Kendo UI

در حالت استفاده از Kendo UI، این سیستم هنوز هم کار می‌کند؛ اما با یک مشکل. اگر برای مثال از kendoComboBox استفاده کنید، اعتبارسنجی‌های تعریف شده در برنامه، توسط jquery.validate دیده نخواهند شد. برای مثال فرض کنید یک چنین مدلی در اختیار View برنامه قرار گرفته است:
    public class OrderDetailViewModel
    {
        [StringLength(15)]
        [Required]
        public string Destination { get; set; }
    }
با این View که در آن به فیلد Destination، یک kendoComboBox متصل شده‌است:
@model Mvc4TestViewModel.Models.OrderDetailViewModel

@using (Ajax.BeginForm(actionName: "Index", controllerName: "Home",
                       ajaxOptions:new AjaxOptions(),
                       htmlAttributes: new { id = "Form1", name ="Form1" }, routeValues: new { }
                       ))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>OrderDetail</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Destination)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.Destination, new { @class = "k-textbox" })
            @Html.ValidationMessageFor(model => model.Destination)
        </div>

        <p>
            <button class="k-button" type="submit" title="Sumbit">
                Sumbit
            </button>
        </p>
    </fieldset>
}

@section JavaScript
{
    <script type="text/javascript">
        $(function () {
            $("#Destination").kendoComboBox({
                dataSource: [
                    "loc 1",
                    "loc 2"
                ]
            });
    </script>
}
اگر برنامه را اجرا کنید و بر روی دکمه‌ی submit کلیک نمائید، ویژگی Required عمل نخواهد کرد و عملا در سمت کاربر اعتبارسنجی رخ نمی‌دهد.


همانطور که در تصویر مشاهده می‌کنید، با اتصال kendoComboBox به یک فیلد، این فیلد در حالت مخفی قرار می‌گیرد و ویجت کندو یو آی بجای آن نمایش داده خواهد شد. در این حالت چون در فایل jquery.validate.js چنین تنظیمی وجود دارد:
$.extend( $.validator, {
    defaults: {
     //…
     ignore: ":hidden",
به صورت پیش فرض از اعتبارسنجی فیلدهای مخفی صرفنظر می‌شود.
راه حل آن نیز ساده‌است. تنها باید خاصیت ignore را بازنویسی کرد و تغییر داد:
    <script type="text/javascript">
        $(function () {
            var form = $('#Form1');
            form.data('validator').settings.ignore = ''; // default is ":hidden".
        });
    </script>
در اینجا صرفا خاصیت ignore فرم یک، جهت درنظر گرفتن فیلدهای مخفی تغییر کرده‌است. اگر می‌خواهید این تنظیم را به تمام فرم‌ها اعمال کنید، می‌توان از دستور ذیل استفاده کرد:
<script type="text/javascript">
    $.validator.setDefaults({
        ignore: ""
    });
</script>


یکپارچه کردن سیستم اعتبارسنجی Kendo UI با سیستم اعتبارسنجی ASP.NET MVC

در مطلب «اعتبار سنجی ورودی‌های کاربر در Kendo UI» با زیرساخت اعتبارسنجی Kendo UI آشنا شدید. برای اینکه بتوان این سیستم را با ASP.NET MVC یکپارچه کرد، نیاز است دو کار صورت گیرد:
الف) تعریف فایل kendo.aspnetmvc.js به صفحه اضافه شود:
 <script src="~/Scripts/kendo.aspnetmvc.js" type="text/javascript"></script>
ب) همانند قبل، متد kendoValidator بر روی فرم فراخوانی شود تا سیستم اعتبارسنجی Kendo UI در این ناحیه فعال گردد:
    <script type="text/javascript">
        $(function () {
            $("form").kendoValidator();
        });
    </script>
پس از آن خواهیم داشت:


فایل kendo.aspnetmvc.js که در بسته‌ی مخصوص Kendo UI تهیه شده برای ASP.NET MVC موجود است (در پوشه‌ی js آن)، عملکردی مشابه فایل jquery.validate.unobtrusive مایکروسافت دارد. کار آن وفق دادن و ترجمه‌ی اعتبارسنجی unobtrusive به روش Kendo UI است.

این فایل را از اینجا می‌توانید دریافت کنید:
kendo.mvc.zip


البته باید دقت داشت که در حال حاضر فقط ویژگی‌های ذیل از ASP.NET MVC توسط kendo.aspnetmvc.js پشتیبانی می‌شوند:
 Required
StringLength
Range
RegularExpression
برای تکمیل آن می‌توان از یک پروژه‌ی سورس باز به نام Moon.Validation for KendoUI Validator استفاده کرد. برای مثال remote validation مخصوص Kendo UI را اضافه کرده‌است.
  • #
    ‫۹ سال و ۱۰ ماه قبل، چهارشنبه ۲۸ آبان ۱۳۹۳، ساعت ۱۶:۳۰
    سئوالی برای من پیش اومد امکان استفاده از مدل mvc داخل کنترل‌های جاوااسکریپت کندو هست ؟ مثلا اگه combobox انتخاب بشه آیدیش در مدل اصلی انتخاب بشه ؟ 
  • #
    ‫۹ سال و ۹ ماه قبل، سه‌شنبه ۲ دی ۱۳۹۳، ساعت ۱۴:۰۷
    من برای فعال سازی remote validation از پروژه  Moon استفاده کردم اما باز هم عمل نمیکنه!
      [Moon.Web.Validation.RemoteValidator("IsUserExist", "Admin", HttpMethod = "POST", ErrorMessage = "نام کاربری قبلا ثبت شده است.")]
            public string Username { get; set; }
      @Html.EditorFor(model => model.Username)
      @Html.ValidationMessageFor(model => model.Username)
      [HttpPost]
            public ActionResult IsUserExist(string Username)
            {
                if (userSerive.isUser(Username)) return Json(true); 
                return Json(false);
            }

    • #
      ‫۹ سال و ۹ ماه قبل، چهارشنبه ۳ دی ۱۳۹۳، ساعت ۱۸:۵۸
      کتابخانه‌ی ذکر شده را حذف و سپس به روش زیر برای فعال سازی remote validation عمل کنید:
                  $.validator.methods.remote = function () { /* disabled */ };
                  $("form").kendoValidator({
                      onfocusout: true,
                      onkeyup: true,
                      rules: {
                          remote: function (input) {
                              var remoteAttr = input.attr("data-val-remote-url");
                              if (typeof remoteAttr === typeof undefined || remoteAttr === false) {
                                  return true;
                              }
      
                              var isInvalid = true;
                              var data = {};
                              data[input.attr('name')] = input.val();
      
                              $.ajax({
                                  url: remoteAttr,
                                  mode: "abort",
                                  port: "validate" + input.attr('name'),
                                  dataType: "json",
                                  type: input.attr("data-val-remote-type"),
                                  data: data,
                                  async: false,
                                  success: function (response) {
                                      isInvalid = response;
                                  }
                              });
                              return !isInvalid;
                          }
                      },
                      messages: {
                          remote: function (input) {
                              return input.data('val-remote');
                          }
                      }
                  });
      - در اینجا در ابتدا متد remote کتابخانه‌ی jQuery Validator غیرفعال می‌شود. سپس یک rule جدید، به kendoValidator به نام دلخواه remote اضافه شده‌است. چون ruleهای kendoValidator اعمال async را پشتیبانی نمی‌کنند، در درخواست ajax آن async: false تنظیم شده‌است. به این ترتیب سطر پس از ajax، پس از پایان کار عملیات ajax فراخوانی می‌شود و در این حالت kendoValidator بدون مشکل کار خواهد کرد.
      - سمت سرور آن هم مانند قبل به همراه استفاده از ویژگی Remote است که از آن صرفا برای مقدار دهی data-val-remote-url و val-remote که در rule جدید استفاده می‌شوند، کمک گرفته خواهد شد.
      • #
        ‫۹ سال و ۹ ماه قبل، پنجشنبه ۴ دی ۱۳۹۳، ساعت ۱۴:۵۸
        خیلی ممنون بابت پاسخگویی
        این روش در حالتی جواب میده که ما اطلاعات رو از طریق فرم ارسال کنیم.
        اما من برای درج یا ویرایش از template در گرید کندو به صورت popup استفاده کردم که در این حالت از فرم برای ارسال اطلاعات استفاده نمی‌کند!
        • #
          ‫۹ سال و ۹ ماه قبل، پنجشنبه ۴ دی ۱۳۹۳، ساعت ۱۵:۰۷
          مراجعه کنید به مطلب «اعتبار سنجی ورودی‌های کاربر در Kendo UI». در انتهای مطلب در مورد «اعتبارسنجی سفارشی در DataSource»  بحث شده‌است. Kendo UI Grid هم اطلاعات اعتبارسنجی فیلدهای خودش را از data source دریافت می‌کند و ... اصول طراحی اعتبارسنجی آن، هیچ تفاوتی با نکته‌ی عنوان شده ندارد (یک custom rule سفارشی را به نام remote، دقیقا مانند همین مثال می‌توانید اضافه کنید).
          • #
            ‫۹ سال و ۹ ماه قبل، پنجشنبه ۴ دی ۱۳۹۳، ساعت ۱۶:۲۴
            باز هم ممنون بابت پاسخگویی
            در حالتی که از popup template داخل گرید استفاده کنیم برای remote validation میشه از مثال شما با اندکی تغییرات استفاده کرد.
             (function($, kendo) {
                        $.extend(true, kendo.ui.validator, {
                            rules: {
                                remote: function(input) {
                                    var remoteAttr = input.attr("data-val-remote-url");
                                    if (typeof remoteAttr === typeof undefined || remoteAttr === false) {
                                        return true;
                                    }
            
                                    var isInvalid = true;
                                    var data = {};
                                    data[input.attr('name')] = input.val();
            
                                    $.ajax({
                                        url: remoteAttr,
                                        mode: "abort",
                                        port: "validate" + input.attr('name'),
                                        dataType: "json",
                                        type: input.attr("data-val-remote-type"),
                                        data: data,
                                        async: false,
                                        success: function(response) {
                                            isInvalid = response;
                                        }
                                    });
                                    return !isInvalid;
                                }
                            },
                            messages: {
                                remote: function(input) {
                                    return input.data('val-remote');
                                }
                            }
                        });
                    })(jQuery, kendo);

            • #
              ‫۷ سال و ۶ ماه قبل، یکشنبه ۶ فروردین ۱۳۹۶، ساعت ۰۲:۱۹
              با سلام و تشکر؛ کندو گرید Remote Validation رو در حالت ویرایش incell پشتیبانی نمیکنه حتی در نسخه 2017
              این هم یک لینک از Remote Validation در کندو گرید
               
  • #
    ‫۷ سال قبل، جمعه ۱۷ شهریور ۱۳۹۶، ساعت ۲۰:۱۰
    جهت اطلاع

    تمام مثال‌های این سری به ASP.NET Core منتقل شدند. کدهای نهایی آن‌ها را از مخزن کد KendoUI.Core.Samples می‌توانید دریافت کنید.
    این مثال‌ها بر اساس Kendo UI Professional R2 2017 SP1 تهیه شده‌اند (فایل‌های مورد نیاز هم پیوست شده‌اند).