چهار روز بود که درگیر این خطا بودم این خطا زمانی رخ میداد که من از TinyMCE به عنوان ادیتور در پروژه #c خودم استفاده کردم
E_LoadingAjax /api/RoxyFileman/DIRLIST
به این صورت که زمانی که کاربر در صفحه کنترل پنل خود از TinyMCE استفاده میکندو برای آپلود عکس یا فیلم و یا اسناد بخواهد از افزوه RoxyFileMan استفاده کند لازم است تا:
- فایل TinyMCE را به قسمت wwwroot اضافه کند
- فایل RoxyFileMan برای دات نت را در پوشه جداگانه در کنار TinyMCE و یا در خود پوشه TinyMCE بگذارد.
- در پروژه های دات نت و دات نت کور (.net , .net Core) لازم است تا یک کنترلر نیز به پروژه اضافه کنید،
- در پروژه های MCV (Model, Controller, View) که به صورت پیشفرض پوشه های مربوطه را دارد به راحتی میتوانید Controller مربوط به RoxyFileMan را به پوشه کنترلر اضافه کنید تنها ادرس های مربوط به محل ذخیره را تغییر دهید ،
- اما زمانی سر خودتون رو به دیوار میکوبید( به مدت 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 گذاشته یودم