خطای E_LoadingAjax /api/RoxyFileman/DIRLIST در زمان اضافه کردن RoxyFileMan در MVC Core

11/26/2020 MVC
1039

چهار روز بود که درگیر این خطا بودم این خطا زمانی رخ میداد که من از TinyMCE به عنوان ادیتور در  پروژه #c خودم استفاده کردم

 

E_LoadingAjax /api/RoxyFileman/DIRLIST

به این صورت که زمانی که کاربر در صفحه کنترل پنل خود از TinyMCE استفاده میکندو برای آپلود عکس یا فیلم و یا اسناد بخواهد از افزوه RoxyFileMan استفاده کند لازم است تا:  

  1.  فایل TinyMCE را به قسمت wwwroot  اضافه کند
  2. فایل RoxyFileMan برای دات نت را در پوشه جداگانه در کنار TinyMCE و یا در خود پوشه TinyMCE بگذارد.
  3. در پروژه های دات نت و  دات نت کور (.net , .net Core) لازم است تا یک کنترلر نیز به پروژه اضافه کنید،
  4. در پروژه های MCV (Model, Controller, View)  که به صورت پیشفرض پوشه های مربوطه را دارد به راحتی میتوانید Controller  مربوط به RoxyFileMan  را به پوشه کنترلر اضافه کنید تنها ادرس های مربوط به محل ذخیره را تغییر دهید ،     
  5.  اما زمانی سر خودتون رو به  دیوار میکوبید( به مدت 4 روز برای من ) که خطا ایجاد شده است و نمیدانید خطا ممکن است مربوط به کدام قسمت کد باشد، آیا دسترسی به File Man دچار مشکل شده ، ایا بهترین جایگاه برای فایل Controller کجاست توی قسمت کنترل پنل بگذرام یا در روت سایت؟ ممکن است مثلا خطا مربوط به (../..) ادرس  دسترسی به RoxyFileMan باشد یا ممکن است تغییر ورژن دات نت کور و تغییر در اضافه شدم Json  به پیشفرض های dotnet این خطا رو به وجود آورده ، یا نه ممکن است از تغییر route در دات نت باشد و هزاران چیز دیگر که توی این چهار روز تست کردم 

اما کنترلر یک API است پس یا به صورت پیشفرض میتوانم با استقاده از Postman  به برگشتی های آن دسترسی پیدا کنم، تازه گرفتم  که مشکل از عدم دسترسی به کنترلر هست ، چرا سیستم به کنترلر دسترسی ندارد در صورتی که فایل کنترلر به صورت Public  تعریف شده

یه تغییر در دات نت کور داشتیم (از کدوم ورژن یادم نیست ) اما این بود که کنترلرها به جای ارث بری از Controller بهتر بود از ContrllerBase  استفاده کنید 

دوباره مشکل بعدی توی کنترلر از

return Json()

استفاده میشد سیستم خطا میداد

باید تبدیل میکردم به 

 return new JsonResult

 

از طرفی برای استفاده از root کردن Controller باید در روت پیشفرض تغییری دهید.

app.UseEndpoints (endpoints => {
                endpoints.MapRazorPages ();
                endpoints.MapControllers();
            });

حالا پروژه را اجراکردم بلاخره حل شد

یه تغییر دیگه هم دادم و این هم فایل program.cs

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

             public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

خلاصه اینکه اضافه کردن کنترلر در Razor Pages ها باید کنترلر از ControllerBase  ارث بری کند نه از Controller تا در پروژه دیده شود 

خنده دار بود و لی لذت برنامه نویسی به همینه

آپدیت: همه کارهای بالا رو انجام دادم اما باز هم خطایی که اول اتفاق میافتاد رو نشون میداد E_LoadingAjax /api/RoxyFileman/DIRLIST

پروژه رو با vscode اجرا کرده بودم و به log های vscode نگاه نمیکردم

خطا با  این صورت بود 

Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: The request matched multiple endpoints. Matches: 

RoxyFilemanController.DIRLIST (Lib.Raz)
WebApplication4.Controllers.RoxyFilemanController.DIRLIST (Lib.Raz)
....

بایدمیدونستم که دو تا ورودی api  با یک نام دارم بعد از کلی گشتن به ای ننتیجه رسیدم یک کنترل api دیگه برای fileman توی پوشه admin گذاشته یودم