رفع خطای Value cannot be null هنگام استفاده از پلاگین JsTree
من پروژه ام رو با asp.net core 3.1 نوشتم و از jstree برای نمایش درختی استفاده کردم .... میخوام بتونم دسترسی های یک گروه رو تغییر دهم ولی با خطای (Value cannot be null. (Parameter 'value روبرو میشم و نمی تونم علت خطا رو به درستی متوجه شم ممنون میشم راهنمایی کنید.
وقتی به خط زیر میرسه این خطا رو میده
  List<TreeViewModel> items = JsonConvert.DeserializeObject<List<TreeViewModel>>(SelectedItems);
کد سمت کنترلر
[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> AddKeyToGroup(string SelectedItems, int GroupId)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    //تبدیل رشته جیسون به یک لیست
                    List<TreeViewModel> items = JsonConvert.DeserializeObject<List<TreeViewModel>>(SelectedItems);
                    if (items.Count() == 0)
                    {
                        return Json(new { status = "noselected" });
                    }
                    //پیدا کردن گروه
                    var group = _context.UserGroupKeys.Find(GroupId);
                    // حذف گروه
                    var deleteGroup =  _context.UserGroupKeys
                        .Where(m => m.GroupId == GroupId)
                        .FirstOrDefault();
                    _context.UserGroupKeys.Remove(deleteGroup);
                    if (deleteGroup == null)
                    {
                        ViewBag.error = "هیچ دسترسی برای گروه مورد وجود نداشت";
                    }
                    else
                    {
                        for(int i = 0; i<= items.Count -1; i++)
                        {
                            UserGroupKey userGroupKey = await _context.UserGroupKeys.FindAsync(items[i].id);
                            if( userGroupKey != null)
                            {
                                _context.UserGroupKeys.Add(userGroupKey);
                                userGroupKey.IsActive = true;
                                await _context.SaveChangesAsync();                                
                            }
                        }
                    }
                }
                catch (DbUpdateConcurrencyException)
                {
                    return RedirectToAction("ErrorView", "Home");
                }
            }
            return View();
        }
کد سمت Html
@{
    ViewData["Title"] = " انتساب دسترسی به گروه ";
}
<div class="content">
    <div class="panel panel-heading" style="box-shadow:3px 1px 0 gray; border-radius:2px; background-color:#fff;">
        <span style="font-weight:bold;">
            <i class="fa fa-universal-access" aria-hidden="true"></i>
            انتساب دسترسی به گروه -  <span style="color:darkgoldenrod;">@ViewBag.GroupDesc</span>
        </span>
    </div>
    <div id="divmsg" style="text-align:center; font-weight:bold" class=""></div>
    <div class="alert alert-info" style="border: 1px solid gray;
        margin-top: 15px;
        text-align: center;
        font-size: 15px;
        background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #1861ac), color-stop(100%, #4a5564));
            color: #fff">
        برای ثبت دسترسی، یک یا چند دسترسی را تیک بزنید
    </div>
    <div class="panel panel-body container-fluid" style="border-radius:2px; box-shadow:0px 1px 3px 0px rgba(0,0,0,0.12);
                display:grid; padding: 3em; background-color:#fff;">
        <form asp-controller="UserGroupKeys" asp-action="AddKeyToGroup" method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div id="jstreesyspart">
            </div>
            <div class="col-xs-12 form-group" style="margin-top:15px;">
                <input type="submit" style="border:1px solid gray; border-radius:3px;" class="btn pull-right" value="ثبت دسترسی" />
            </div>
        </form>
    </div>
    @if (ViewBag.groupRole != null)
    {
        <input id="rolelist" type="hidden" value="@ViewBag.groupRole" />
    }
    <input name="SelectedItems" id="SelectedItems" type="hidden" />
    <input name="GroupId" id="GroupId" type="hidden" value="@ViewBag.GroupId" />
    <div class="col-xs-12 form-group" style="margin-top:15px;">
    </div>
</div>
@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    <script>
        $(function () {
            $("#jstreesyspart").on("changed.jstree", function (e, data) {
                var i, j;
                var postedItems = [];
                j = data.selected.length;
                for (var i = 0; i < j; i++) {
                    postedItems.push({
                        text: data.instance.get_node(data.selected[i]).text,
                        id: data.selected[i],
                        parent: data.node.parents[0]
                    });
                    $("#SelectedItems").val(JSON.stringify(postedItems));
                }
            }).jstree({
                "core": {
                    "themes": {
                        "variant":"large"
                    },
                    "data":  @Html.Raw(ViewBag.SystemPart) ,
                },
                "checkbox": {
                    "visable": true,
                    "Keep_selected_style":false
                },
                "plugins": ["checkbox"]
                //checkbox: { three_state: false, cascade:"" }
            }).on("loaded.jstree", function () {
                $.jstree.reference('#jstreesyspart').open_all();
                var urole = $("#rolelist").val().split(",");
                $("#jstreesyspart").jstree(true).select_node(urole);
            });
        });
    </script>
پاسخ هوش مصنوعی
خطای "Value cannot be null" به این علت رخ می دهد که ورودی `SelectedItems` به کنترلر، به هنگام ارسال خالی است یا null است. برای رفع این مشکل موارد زیر را بررسی کنید:
- اطمینان از اعتبار داده: قبل از ارسال داده ها به کنترلر، اطمینان حاصل کنید که مقدار `SelectedItems` خالی نیست. می توانید در تابع جاوااسکریپت مربوط به رویداد `changed.jstree`، بررسی کنید که آیا انتخابی انجام شده است یا خیر.
 - چک کردن مقدار انتخاب شده: قبل از فراخوانی `$("#SelectedItems").val(JSON.stringify(postedItems));` اطمینان حاصل کنید که آرایه `postedItems` حداقل یک عنصر دارد.
 
برای مثال، می توانید به کد جاوااسکریپت زیر توجه کنید و تغییرات لازم را انجام دهید:
$(function () {
    $("#jstreesyspart").on("changed.jstree", function (e, data) {
        var postedItems = [];
        // بررسی اینکه آیا انتخابی وجود دارد
        if (data.selected.length > 0) {
            for (var i = 0; i < data.selected.length; i++) {
                postedItems.push({
                    text: data.instance.get_node(data.selected[i]).text,
                    id: data.selected[i],
                    parent: data.node.parents[0]
                });
            }
            // مقدار SelectedItems را تنها در صورت وجود انتخاب تنظیم کنید
            $("#SelectedItems").val(JSON.stringify(postedItems));
        } else {
            $("#SelectedItems").val(''); // در صورت عدم انتخاب، مقدار را خالی کنید
        }
    }).jstree({
        // پیکربندی jsTree
    });
});
همچنین می توانید در کنترلر خود، پیش از فراخوانی `JsonConvert.DeserializeObject` بررسی کنید که آیا `SelectedItems` خالی است یا نه:
if (string.IsNullOrEmpty(SelectedItems)) {
    return Json(new { status = "noselected" });
}
با این کار می توانید از ایجاد خطا در اثر ورودی خالی جلوگیری کنید و از طریقی مدیریت بهتری برای ورودی های نادرست فراهم نمایید.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
 - نمایش متن به صورت فرمت شده در CkEditor
 - آموزش استفاده از SignalR در Asp.net Core با مثال عملی
 - ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
 - نحوه تغییر استایل کامپوننت select2 چگونه است ؟
 - چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
 - ارسال پارامتر در دستور window.open جی کویری
 - ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
 - خطای 500 زمان اجرا شدن پروژه روی هاست
 - کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
 
- کار با CkEditor با قابلیت آپلود عکس
 - خطا در ایجاد migration در Asp.net core
 - تفاوت های Asp.net core و Asp.net mvc چیه؟
 - دلیل اسپم شدن ایمیل های ارسالی از سرور
 - نحوه لایه بندی پروژه Core و اضافه کردن به IIS
 - ارسال ایمیل در Asp.net core
 - آیا میشه در mvc core از کامپونت استفاده کرد
 - آپلود فایل در Asp.net core چگونه است؟
 - حذف کامل یک رکورد در جدول ریلیشن شده
 - اشکال در آپلود فایل ویدیو در mvc core 2