public class PatientEditInfoViewModel
{
[Required(ErrorMessage = "لطفاً شماره تماس دوم را وارد کنید")]
[Phone(ErrorMessage = "شماره تماس دوم معتبر نیست")]
[Display(Name = "شماره تلفن دوم")]
public string SecondaryPhoneNumber { get; set; }
[Required(ErrorMessage = "لطفاً کد ملی را وارد کنید")]
[StringLength(10, MinimumLength = 10, ErrorMessage = "کد ملی باید دقیقاً 10 رقم باشد")]
[Display(Name = "کد ملی")]
public string NationalCode { get; set; }
[Required(ErrorMessage = "لطفاً تصویر کارت ملی را وارد کنید")]
[Display(Name = "تصویر کارت ملی")]
public string NationalCardImagePath { get; set; }
[Required(ErrorMessage = "لطفاً آدرس را وارد کنید")]
[StringLength(500, ErrorMessage = "آدرس نمیتواند بیشتر از 500 کاراکتر باشد")]
[Display(Name = "آدرس")]
public string Address { get; set; }
public IFormFile NationalCardImageFile { get; set; }
}
< /code>
Моя модель: < /p>
public class Patient
{
[Key]
public int Id { get; set; }
[Required(ErrorMessage = "لطفاً نام و نام خانوادگی را وارد کنید")]
[Display(Name = "نام و نام خانوادگی")]
[StringLength(100, ErrorMessage = "نام کامل نمیتواند بیشتر از 100 کاراکتر باشد")]
public string FullName { get; set; }
[Required(ErrorMessage = "لطفاً شماره تماس را وارد کنید")]
[Display(Name = "شماره تماس")]
[Phone(ErrorMessage = "شماره تماس وارد شده معتبر نیست")]
public string PrimaryPhoneNumber { get; set; }
[Display(Name = "شماره تماس دوم")]
[Phone(ErrorMessage = "شماره تماس دوم معتبر نیست")]
[Required(ErrorMessage = "لطفاً شماره تماس دوم را وارد کنید")]
public string SecondaryPhoneNumber { get; set; }
[Required(ErrorMessage = "لطفاً کد ملی را وارد کنید")]
[Display(Name = "کد ملی")]
[StringLength(10, MinimumLength = 10, ErrorMessage = "کد ملی باید دقیقاً 10 رقم باشد")]
public string NationalCode { get; set; }
[Display(Name = "تصویر کارت ملی")]
[Required(ErrorMessage = "لطفاً تصویر کارت ملی را وارد کنید")]
public string NationalCardImagePath { get; set; }
[Display(Name = "آدرس")]
[StringLength(500, ErrorMessage = "آدرس نمیتواند بیشتر از 500 کاراکتر باشد")]
[Required(ErrorMessage = "لطفاً آدرس را وارد کنید")]
public string Address { get; set; }
[Display(Name = "رمز عبور")]
[Required(ErrorMessage = "لطفاً رمز عبور را وارد کنید")]
[StringLength(100, MinimumLength = 6, ErrorMessage = "رمز عبور باید حداقل 6 کاراکتر باشد")]
[DataType(DataType.Password)]
public string Password { get; set; }
//
[Display(Name = "تأیید شماره موبایل")]
public bool IsPhoneVerified { get; set; } = false;
[Display(Name = "کد تأیید")]
public string PhoneVerificationCode { get; set; }
[Display(Name = "تاریخ انقضای کد تأیید")]
public DateTime? PhoneVerificationExpiry { get; set; }
//
[Display(Name = "تاریخ ثبت")]
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
[Display(Name = "تاریخ آخرین بروزرسانی")]
public DateTime UpdatedAt { get; set; } = DateTime.UtcNow;
[Display(Name = "آخرین ورود")]
public DateTime? LastLoginAt { get; set; }
}
< /code>
Мой контроллер: < /p>
[HttpGet]
public async Task CompleteInfo()
{
int? userId = HttpContext.Session.GetInt32("UserId");
if (userId == null)
return RedirectToAction("Login", "Account", new { area = "" });
var patient = await _context.Patients.FindAsync(userId);
if (patient == null)
return RedirectToAction("Login", "Account", new { area = "" });
if (!patient.IsPhoneVerified)
{
// شماره تلفن تایید نشده، ریدایرکت یا نمایش پیام مناسب
return RedirectToAction("Index", "Dashboard", new { area = "PatientPanel" });
}
// مقداردهی اولیه مدل فقط برای فیلدهای تکمیل اطلاعات
var model = new PatientEditInfoViewModel
{
SecondaryPhoneNumber = string.IsNullOrWhiteSpace(patient.SecondaryPhoneNumber) ? "" : patient.SecondaryPhoneNumber,
NationalCode = string.IsNullOrWhiteSpace(patient.NationalCode) ? "" : patient.NationalCode,
NationalCardImagePath = string.IsNullOrWhiteSpace(patient.NationalCardImagePath) ? "" : patient.NationalCardImagePath,
Address = string.IsNullOrWhiteSpace(patient.Address) ? "" : patient.Address
};
return View(model);
}
[HttpPost]
public async Task CompleteInfo(PatientEditInfoViewModel model)
{
if (!ModelState.IsValid)
return View(model);
var userId = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value);
var patient = await _context.Patients.FindAsync(userId);
if (patient == null)
return RedirectToAction("Login", "Account");
// فقط فیلدهایی که توی ویو مدل داریم آپدیت میشن
patient.SecondaryPhoneNumber = model.SecondaryPhoneNumber;
patient.NationalCode = model.NationalCode;
patient.Address = model.Address;
if (model.NationalCardImageFile != null)
{
var uploadsFolder = Path.Combine(_hostEnvironment.WebRootPath, "img/national-card");
Directory.CreateDirectory(uploadsFolder);
var uniqueFileName = $"{Guid.NewGuid()}_{model.NationalCardImageFile.FileName}";
var filePath = Path.Combine(uploadsFolder, uniqueFileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
await model.NationalCardImageFile.CopyToAsync(stream);
}
patient.NationalCardImagePath = $"/img/national-card/{uniqueFileName}";
}
patient.UpdatedAt = DateTime.UtcNow;
_context.Patients.Update(patient);
await _context.SaveChangesAsync();
TempData["SuccessMessage"] = "اطلاعات شما با موفقیت ثبت شد";
return RedirectToAction("Dashboard");
}
< /code>
my view: < /p>
@using installments_Payment.Core.ViewModels
@model PatientEditInfoViewModel
تکمیل اطلاعات کاربری
@if (TempData["ErrorMessage"] != null)
{
@TempData["ErrorMessage"]
}
@if (TempData["SuccessMessage"] != null)
{
}
ثبت اطلاعات
برگشت به پنل
@section Scripts {
}
< /code>
Я работаю над проектом MVC Core ASP.NET, где у меня есть субъект пациента с несколькими полями, включая поле изображения для загрузки изображения профиля. У меня есть форма редактирования, в которой я заполняю все поля и отправляю ее, но после публикации изменения не появляются в базе данных (таблица пациентов). < /P>
Я подозреваю, что проблема может быть связана с обработкой загрузки изображения. Я не реализовал загрузки изображений в ядро ASP.NET в течение долгого времени, поэтому я мог бы что -то упустить в контроллере или представлении. Попробуйте редактировать без загрузки нового изображения, ничего не меняется в таблице.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... n-n-fields