Saya sedang membangun aplikasi web Razor Pages yang akan mendaftarkan pengguna ke dalam ujian. Model ExamRegistration memiliki bidang yang disebut MaxDateForExam yang dapat dibatalkan karena ini adalah fitur baru yang ditambahkan ke database yang ada di lain waktu. Saat membuat ujian, saya ingin mengisi bidang ini dengan nilai setelah OnPost.

Jika pengguna mendaftar ujian untuk pertama kalinya, cukup dapatkan ExamDate dan tambahkan 1 tahun. Pada pendaftaran berikutnya (ujian pengguna gagal) saya tidak ingin membuat MaxDate baru tetapi mengambil MaxDate dari catatan pendaftaran pertama kali.

Model ExamRegistrations saya memiliki properti berikut:

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime? MaxDateForExam { get; set; }

Pada halaman tempat saya akan mendaftarkan seseorang ke ujian baru, saya perlu melakukan pemeriksaan:

  • Jika orang tersebut mendaftar pertama kali, saya akan mengambil ExamDate dan tambahkan satu tahun untuk itu yang kemudian akan mengisi MaxDateForExam bidang.

  • Jika pengguna mendaftar untuk ujian yang bukan pertama kalinya saya perlu agar aplikasi masuk ke tabel ExamRegistration dan ambil
    nilai MaxDateForExam yang ada untuk pendaftaran sebelumnya (jika
    satu ada). Inilah yang saya miliki sejauh ini.

Saya hanya tidak dapat menemukan kode yang benar untuk mengekstrak nilai MaxDateForExam. Ini adalah bagian dari kode saya ....

public DateTime MaxWriteDate { get; set; }                 
public Models.ExamRegistration ApplicantRecord { get; set; }

if(ExamRegistration.ExamAttempt == "1st Attempt")
     {                    
        MaxWriteDate = ExamRegistration.Exam.ExamDate.AddYears(1);
     }
     else
     {
         ApplicantRecord = _context.ExamRegistrations                        
         .Where(m => m.ApplicantID == ExamRegistration.ApplicantID && m.ExamAttempt == "1st Attempt") 
         .FirstOrDefault();

         if(ApplicantRecord == null)
          {
              MaxWriteDate = ExamRegistration.Exam.ExamDate.AddYears(1);
          }
          else
          {
               MaxWriteDate = ApplicantRecord.MaxDateForExam;   ???????FAILS????????
          }
      }

Arah apa pun yang bisa saya dapatkan akan sangat membantu. Kesalahan sepertinya selalu berkisar pada tidak dapat mengonversi System.DateTime? ke System.DateTime. Apakah Anda kehilangan pemeran.

Saya telah menandai jawaban sebagai benar dan saya telah belajar lebih banyak tentang tipe C# dan nullable. Terima kasih.

Saya bisa melewati kesalahan dengan menggunakan kode:

MaxWriteDate = OldMaxWriteDate.MaxDateForExam ?? DateTime.MinValue;

Terima kasih untuk bantuannya.

PS.... Jika saya perlu menandai sesuatu yang lain (pengguna pertama kali ke sumber daya yang hebat), beri tahu saya.

Terima kasih

0
Richard Armstrong 27 Maret 2020, 17:02

1 menjawab

Jawaban Terbaik

Ini karena nilai MaxDateForExam mungkin nol, jadi Anda tidak boleh menetapkannya ke variabel yang tidak dapat dibatalkan. Coba ini:

      if(ApplicantRecord == null)
      {
          MaxWriteDate = ExamRegistration.Exam.ExamDate.AddYears(1);
      }
      else
      {
          if (MaxDateForExam.HasValue)
          {
              MaxWriteDate = ApplicantRecord.MaxDateForExam.Value;
          }
          else
          {
              // Handle case where MaxDateForExam does not have a value
          }
      }

Lihat dokumentasi jenis nilai nullable untuk informasi lebih lanjut:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/nullable-value-types

0
Shawn Paige 27 Maret 2020, 20:51