سلام.
سایتی طراحی کردم که سه تا جدول داره
کلاس: 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 اضافه یا ویرایش شد.
اگر منظورتون واسه تست اعتبارسنجی مقایر ورودی هست من از دستور 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; }
تاریخ :
1403/10/22
- ساعت :
12:29:00 PM
- بازدید :
93
- پاسخ :
1
|
تاریخ :
1399/09/20
- ساعت :
01:21:00 PM
- بازدید :
6655
- پاسخ :
1
|
تاریخ :
1403/11/02
- ساعت :
08:17:00 PM
- بازدید :
55
- پاسخ :
0
|
تاریخ :
1398/10/19
- ساعت :
02:01:00 PM
- بازدید :
3094
- پاسخ :
2
|
تاریخ :
1398/10/26
- ساعت :
10:24:00 PM
- بازدید :
2133
- پاسخ :
1
|
تاریخ :
1403/10/30
- ساعت :
12:33:00 AM
- بازدید :
76
- پاسخ :
1
|
تاریخ :
1403/10/30
- ساعت :
12:40:00 AM
- بازدید :
68
- پاسخ :
1
|
تاریخ :
1403/10/30
- ساعت :
12:39:00 AM
- بازدید :
95
- پاسخ :
1
|
تاریخ :
1398/10/19
- ساعت :
02:54:00 PM
- بازدید :
2805
- پاسخ :
3
|
تاریخ :
1403/10/25
- ساعت :
12:39:00 AM
- بازدید :
152
- پاسخ :
1
|
تاریخ :
1403/11/03
- ساعت :
07:34:00 PM
- بازدید :
68
- پاسخ :
0
|
تاریخ :
1399/12/20
- ساعت :
10:32:00 AM
- بازدید :
2521
- پاسخ :
1
|
تاریخ :
1398/08/09
- ساعت :
07:44:00 PM
- بازدید :
4860
- پاسخ :
1
|
تاریخ :
1399/09/20
- ساعت :
01:30:00 PM
- بازدید :
2578
- پاسخ :
1
|
تاریخ :
1403/11/03
- ساعت :
07:21:00 PM
- بازدید :
49
- پاسخ :
0
|
تاریخ :
1403/10/22
- ساعت :
12:29:00 PM
- بازدید :
93
- پاسخ :
1
|
تاریخ :
1399/09/20
- ساعت :
01:21:00 PM
- بازدید :
6655
- پاسخ :
1
|
تاریخ :
1403/11/02
- ساعت :
08:17:00 PM
- بازدید :
55
- پاسخ :
0
|
تاریخ :
1398/10/15
- ساعت :
08:02:00 PM
- بازدید :
2731
- پاسخ :
1
|
تاریخ :
1398/10/19
- ساعت :
02:01:00 PM
- بازدید :
3094
- پاسخ :
2
|