• 1402/10/17
  • 0
  • 63
1402/10/17 |
backend

مشکل insert در دیتابیس - ستارگان ASP

سلام

(این قسمت رو برای دوستانی که پکیج رو دارن می نویسم) 

تو قسمتی که catalogitem رو به همراه عکس و ویژگی ها در دیتابیس اضافه میکنیم از ajax در سمت کلاینت برای انتقال دیتا به بک اند و درج در جدول استفاده میکنیم

تو اون قسمت ما ویژگی های محصول رو هم با استفاده از ایجکس اضافه میکنیم

اما مشکل من

من پروژه ای رو دارم که میخوام (مثل قسمت اضافه کردن ویژگی ها) از کاربر مشخصات افراد رو بگیرم

و یک باره به صورت لیست اون رو به سمت بک اند بفرستم و در جدول ام اضافه کنم

اما وقتی این کار رو میکنم Mapper به من اخطار میده

کد ها رو میزارم که بهم کمک کنین ممنون

کد قسمت سرویس های لایه اپلیکیشن

 public class AddNewPoolScheduleDto
 {
     public int Id { get; set; }
     public string Title { get; set; }
     public string Schedule { get; set; }
     public string Description { get; set; }
     public string Gender { get; set; }
     public string CaFree { get; set; }
     public string CaSpecial { get; set; }
     public string Price { get; set; }
     public string Date { get; set; }

 }

 

کد سرویس:

 public interface IAddNewPoolSchedule
 {
     BaseDto<int> Execte(AddNewPoolScheduleDto request);
 }

 public class AddNewPoolSchedule : IAddNewPoolSchedule
 {
     private readonly IDataBaseContext _context;
     private readonly IMapper _mapper;

     public AddNewPoolSchedule(IDataBaseContext context,IMapper mapper)
     {
         _context = context;
         _mapper = mapper;
     }

      public BaseDto<int> Execte(AddNewPoolScheduleDto request)
      {
          var _pool = _mapper.Map<PoolSchedule>(request);
          _context.PoolSchedule.Add(_pool);
          _context.SaveChanges();
          return new BaseDto<int>(_pool.Id, new List<string> { "با موفقیت ثبت شد" }, true);
      }
  }

 

کد صفحه کاربر

 

صرفا ایجکس رو میزارم

 

 var dataFeaturesViewModel = $('#tbl_Features tr:gt(0)').map(function () {
     return {
         Title: $(this.cells[0]).text(),
         gender: $(this.cells[1]).text(),
         Schedule: $(this.cells[2]).text(),
         CaFree: $(this.cells[3]).text(),
         CaSpecial: $(this.cells[4]).text(),
         Price: $(this.cells[5]).text(),

     };
 }).get();

 $.each(dataFeaturesViewModel, function (i, val) {
     data.append('[' + i + '].Title', val.Title);
     data.append('[' + i + '].gender', val.gender);
     data.append('[' + i + '].Schedule', val.Schedule);
     data.append('[' + i + '].CaFree', val.CaFree);
     data.append('[' + i + '].CaSpecial', val.CaSpecial);
     data.append('[' + i + '].Price', val.Price);
 });


 var ajaxRequest = $.ajax({
     type: "POST",
     url: "/Pool_Schedule/create",
     contentType: false,
     processData: false,
     data: data,
     headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() },
     success: function (data) {

 

 

کد سمت بک اند

 

[BindProperty]
public AddNewPoolScheduleDto Data { get; set; }
public void OnGet()
{
}

public JsonResult OnPost()
{
    if (!ModelState.IsValid)
    {
        var allError = ModelState.Values.SelectMany(v => v.Errors);
        return new JsonResult(new BaseDto<int>(0, allError.Select(p => p.ErrorMessage).ToList(), false));
    }

    var resultService = _poolSchedule.Execte(Data);
    return new JsonResult(resultService);

}

 

کد Mapper

            CreateMap<PoolSchedule, List<AddNewPoolScheduleDto>>().ReverseMap();
 


مشکل احتمالی که می‌تواند وجود داشته باشد:

  1. نحوه ارسال داده‌ها از سمت کلاینت: شما داده‌ها را به صورت فرم داده (FormData) ارسال می‌کنید. این ممکن است باعث ایجاد مشکل در دریافت و تفسیر صحیح داده‌ها در سمت سرور شود. بهتر است داده‌ها را به صورت JSON ارسال کنید.
  2. تعریف نوع داده‌ها در سرور: اطمینان حاصل کنید که سرور در انتظار دریافت یک لیست از AddNewPoolScheduleDto است و نه یک شیء تکی.
  3. تنظیمات AutoMapper: اطمینان حاصل کنید که تنظیمات AutoMapper به درستی انجام شده باشد. CreateMap<PoolSchedule, List<AddNewPoolScheduleDto>>().ReverseMap(); به نظر می‌رسد که می‌خواهد یک شیء PoolSchedule را به یک لیست از AddNewPoolScheduleDto مپ کند که ممکن است منطقی نباشد. شما نیاز دارید که هر شیء از AddNewPoolScheduleDto را به یک شیء PoolSchedule مپ کنید.

برای حل این مشکلات، پیشنهاد می‌کنم مراحل زیر را دنبال کنید:

  1. تغییر نحوه ارسال داده‌ها: به جای استفاده از FormData، داده‌ها را به صورت JSON ارسال کنید. برای این کار، شما می‌توانید JSON.stringify(dataFeaturesViewModel) را در AJAX استفاده کنید و contentType: 'application/json' را تنظیم کنید.
  2. تنظیمات سمت سرور: اطمینان حاصل کنید که سمت سرور در انتظار دریافت یک JSON حاوی لیستی از AddNewPoolScheduleDto است.
  3. بررسی AutoMapper: اطمینان حاصل کنید که تنظیمات AutoMapper به درستی انجام شده و می‌تواند هر شیء AddNewPoolScheduleDto را به یک شیء PoolSchedule مپ کند.
  4.  

 1. نحوه ارسال داده‌ها از سمت کلاینت به صورت JSON:
به جای استفاده از FormData, شما می‌توانید داده‌ها را به صورت JSON ارسال کنید. در زیر نمونه کد جاوا اسکریپت برای این کار آمده است:

var dataFeaturesViewModel = $('#tbl_Features tr:gt(0)').map(function () {
    return {
        Title: $(this.cells[0]).text(),
        gender: $(this.cells[1]).text(),
        Schedule: $(this.cells[2]).text(),
        CaFree: $(this.cells[3]).text(),
        CaSpecial: $(this.cells[4]).text(),
        Price: $(this.cells[5]).text(),
    };
}).get();

var jsonData = JSON.stringify(dataFeaturesViewModel);

$.ajax({
    type: "POST",
    url: "/Pool_Schedule/create",
    contentType: 'application/json',
    data: jsonData,
    headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() },
    success: function (response) {
        // برخورد با پاسخ
    },
    error: function (error) {
        // برخورد با خطا
    }
});

 

 

2. تعریف نوع داده‌ها در سرور:
اطمینان حاصل کنید که متد OnPost در کنترلر ASP.NET Core شما لیستی از AddNewPoolScheduleDto را به عنوان ورودی می‌پذیرد. به این ترتیب:

[HttpPost]
public JsonResult OnPost([FromBody] List<AddNewPoolScheduleDto> dataList)
{
    if (!ModelState.IsValid)
    {
        var allError = ModelState.Values.SelectMany(v => v.Errors);
        return new JsonResult(new BaseDto<int>(0, allError.Select(p => p.ErrorMessage).ToList(), false));
    }

    // اجرای عملیات برای هر عنصر در dataList
    foreach(var data in dataList)
    {
        var resultService = _poolSchedule.Execte(data);
        // برخورد با نتیجه
    }

    // بازگشت پاسخ مناسب
}

3. تنظیمات AutoMapper:
در اینجا، شما باید یک نگاشت (mapping) ساده از AddNewPoolScheduleDto به PoolSchedule داشته باشید. نمونه کد زیر نحوه انجام این کار را نشان می‌دهد:

 

// در Startup.cs یا هر جای دیگری که AutoMapper را پیکربندی می‌کنید
public void ConfigureServices(IServiceCollection services)
{
    // سایر تنظیمات...

    // تنظیم AutoMapper
    services.AddAutoMapper(config =>
    {
        config.CreateMap<AddNewPoolScheduleDto, PoolSchedule>();
        // می‌توانید مپینگ‌های دیگر را نیز اینجا اضافه کنید
    });
}

 

موفق باشد.



پاسخی برای این باگ ارسال کنید

لطفا کدها را درون قطعه کد ارسال نمایید

برای ارسال پاسخ باید وارد حساب کاربری خود شوید
ورود به حساب کاربری