معتبر نبودن مدل ارسالی به متد OnPostAsync موقع ایجاد یا ویرایش
سلام.
سایتی طراحی کردم که سه تا جدول داره
کلاس: Course
public class Course
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CourseID { get; set; }
public string Title { get; set; }
public int Credits { get; set; }
public ICollection<Enrollment> Enrollments { get; set; }
}
کلاس: Enrollment
namespace ContosoUniversity.Models
{
public enum Grade
{
A, B, C, D, F
}
public class Enrollment
{
[Key]
public int EnrollmentID { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
[DisplayFormat(NullDisplayText = "No grade")]
public Grade? Grade { get; set; }
public Course Course { get; set; }
public Student Student { get; set; }
}
}
کلاس: Student
public class Student
{
[Key]
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
public ICollection<Enrollment> Enrollments { get; set; }
}
کلاس: DbContext
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<Student> students { get; set; }
public DbSet<Enrollment> enrollments { get; set; }
public DbSet<Course> courses { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Course>().ToTable(nameof(courses));
builder.Entity<Enrollment>().ToTable(nameof(enrollments));
builder.Entity<Student>().ToTable(nameof(Student));
}
}
در ادامه Page Model و PageView رو با Scafolld مطابق زیر به وجود آوردم.
Create.cshtml
@page
@model ContosoUniversity.Pages.Students.CreateModel
@{
ViewData["Title"] = "Create";
Layout = "~/Pages/Shared/_Layout.cshtml";
}
<h1>Create</h1>
<h4>Student</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Student.LastName" class="control-label"></label>
<input asp-for="Student.LastName" class="form-control" />
<span asp-validation-for="Student.LastName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Student.FirstMidName" class="control-label"></label>
<input asp-for="Student.FirstMidName" class="form-control" />
<span asp-validation-for="Student.FirstMidName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Student.EnrollmentDate" class="control-label"></label>
<input asp-for="Student.EnrollmentDate" class="form-control" />
<span asp-validation-for="Student.EnrollmentDate" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-page="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Create.cshtml.cs
public class CreateModel : PageModel
{
private readonly ContosoUniversity.Data.ApplicationDbContext _context;
public CreateModel(ContosoUniversity.Data.ApplicationDbContext context)
{
_context = context;
}
public IActionResult OnGet()
{
return Page();
}
[BindProperty]
public Student Student { get; set; } = default!;
// To protect from overposting attacks, see https://aka.ms/RazorPagesCRUD
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid || _context.students == null || Student == null)
{
return Page();
}
_context.students.Add(Student);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
}
پس از اجر و وارد شدن به صفحه /Students/Create و وارد کردن داده ها و زدن دکمه Create داده ها به متد OnPostAsync ارسال می شود اما در آنجا به دلیل اینکه اعتبار داده ها در اعتبار سنجی رد میشود داده ای ثبت نمیشود.
میخوام ببینم دلیل اینکه داده ها معتبر نیست چیه

با دیباگ کردن برنامه اطلاعاتی که به متد OnPostAsync ارسال میشود اینگونه است.

حالا خطا کجاست؟
عملیات نمایش و حذف داده ها به درستی انجام میشود و همچنینم من این کار را با حذف ارتباط بین جداول انجام دادم که در این صورت اطلاعات به درستی در جدول Student اضافه یا ویرایش شد.
پاسخ هوش مصنوعی
برای مشکلات مربوط به اعتبارسنجی داده ها در متد OnPostAsync، موارد زیر را بررسی کنید:
1. **تخصیص هر فیلد با ویژگی های اعتبارسنجی:** اطمینان حاصل کنید که تمام فیلدهای مربوط به کلاس `Student` در فرم Create.cshtml با مشخصات مربوطه و قوانین اعتبارسنجی کامل شده اند. به عنوان مثال، باید در نظر بگیرید که کدام فیلدها ممکن است نیاز به آدرس دهی خاص داشته باشند، مانند اندازه حداکثر یا الزامی بودن.
2. **چک کردن مقادیر برای null یا مقادیر نامعتبر:** در فرمی که ارسال می شود، اطمینان حاصل کنید که هیچ کدام از فیلدها خالی یا مقادیر نامعتبر ندارند. مثلا اطمینان از اینکه تاریخ های ورودی معتبر هستند (مانند `EnrollmentDate`).
3. **بازبینی کد html و BindProperty:** با دقت بررسی کنید که آدرس دهی به متغیرها در `Create.cshtml` با `BindProperty` در `CreateModel` هماهنگ باشد. به طور خاص، اطمینان حاصل کنید که هیچ یک از نام ها اشتباه وارد نشده اند.
// یک بررسی برای گرفتن بررسی خطا
public async Task<IActionResult> OnPostAsync()
{
// بررسی وضعیت مدل
if (!ModelState.IsValid)
{
// در صورت نامعتبر بودن، داده ها را بشناسید
return Page();
}
// اضافه کردن دانشجو
_context.students.Add(Student);
await _context.SaveChangesAsync();
// بازگشت به لیست
return RedirectToPage("./Index");
}
4. **تست بدون ویژگی های اعتبارسنجی:** برای تست، می توانید موقتا ویژگی های اعتبارسنجی را از روی فیلدهای `Student` حذف کنید تا مطمین شوید که آیا این ویژگی ها علت مشکلات اعتبارسنجی هستند یا خیر.
5. **گزارش خطا:** دقت کنید که خطاهای احتمالی مربوط به اعتبارسنجی را در `ModelState` مرور کنید. ممکن است با بررسی محتوای `ModelState` جزییات بیشتری از خطاها ارایه دهند.
6. **مدل سازی موجودی در DbContext:** آیا جدول Student در DbContext به درستی پیکربندی شده است؟ باید مطمین شوید که DbSet برای دانشجویی که می خواهید ایجاد کنید، به درستی تعریف شده است.
اگر منظورتون واسه تست اعتبارسنجی مقایر ورودی هست من از دستور ModelState.IsValid استفاده کردم و Breakpoint رو روی آن قرار دادم که مقدار آن false میشه و بعد واسه بررسی مقادیر ارسالی، Student رو به watch اضافه کردم که مقادیر زیر به متد Onpost ارسال شده بود

مقدار تاریخ هم درسته اگه اشکالی هست از ID یا Enrollment هست که برابر null هست.
اگر در کلاس Student و همچنین کلاس Enrollment خط آخر که مربوط به رابطه بین این دو جدول هست کامنت بشه دیگه مشکلی نداره و می توانم رکورد جدید در جدول Student ایجاد یا رکورد موجود را ویرایش کنم.
من فکر میکنم هر مشکلی هست در قسمت ایجاد روابط بین دو جدول هست که ایجاد مشکل میکنه
تصویر زیر رو با دقت نگاه کنید. شما اگر روی Model.IsValid یک بریک پوینت بذارید می تونید تک به تک پارامترها رو از نظر Valid یا Invalid بودن ببینید.

می بینید که در تصویر بالا همه پارامترها Valid هستن. حالا اگر پارامتری مشکلی داشته باشه Invalid مینویسه و می تونید دلیل خطاش رو هم ببینید.
موفق باشید.
ممنون آقای بحرانی فرد به خاطر راهنمایی.
پارامترها را چک کردم و اشکال از همان جایی هست که فکر میکردم

ایراد از همون روابط بین جدول Student و Enrollment هست
مطابق کد های زیر در جدول Student من 4 فیلد تعریف کردم که در زمان ایجاد رکورد جدید مقادیر این 4 فیلد ارسالی به متد Onpost همگی valid هستند و آخرین خط هم که مربوط به رابطه یک به چندی هست که تعریف کردم .
public class Student
{
[Key]
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
public ICollection<Enrollment> Enrollments { get; set; }
}
مگر برای Enrollments باید مقداری به برنامه ارسال شود که مقدار آن null نشود؟
البته من این رابطه یک به چند بین این دو جدول را به صورت Fluent API در قسمت کلاس DbContext هم معرفی کردم که باز هم مشکلم حل نشد.
حالا من فکر میکنم مشکل توی تعریف روابط بین جداول باشه اما متوجه نمیشوم که اشتباه کارم کجاست.
ممنون میشم که راهنمایی کنید.
سلام.
من توی اون خط آخر یک علامت سوال واسه null بودن اضافه کردم (مطابق کد زیر) و الان برنامه درست کار میکنه میخواستم ببینم این از لحاظ منطق برنامه مشکلی نداره؟
public ICollection<Enrollment>? Enrollments { get; set; }
- خطا موقع استفاده از Api در سی شارپ
- آموزش استفاده از پلاگین گردونه شانس در 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