Входные данные частичного представления, не привязывающиеся к модели BindProperty ⇐ C#
-
Anonymous
Входные данные частичного представления, не привязывающиеся к модели BindProperty
У меня есть внутренний код:
частный только для чтения IEmployeeRepository сотрудникРепозиторий; частный контекст AppDbContext только для чтения; частная среда веб-хоста IWebHostEnvironment только для чтения; [BindProperty] общественный клиентский клиент {get; набор; } [BindProperty] public IFormFile Photo {get; набор; } public SignUpModel (IEmployeeRepository сотрудникРепозиторий, контекст AppDbContext, среда веб-хоста IWebHostEnvironment) { this.employeeRepository = сотрудникRepository; this.context = контекст; this.webhostenvironment = webhostenvironment; } общедоступный IActionResult OnGet (int? id) { если (id.HasValue) { Клиент = сотрудникРепозиторий.GetClient(id); } вернуть страницу(); } общественный IActionResult OnPost (int? id) { пытаться { если (!id.HasValue) { ModelState.Remove("ИдентификаторКлиента"); ModelState.Remove("photoPath"); если (ModelState.IsValid) { результат вар = сотрудникРепозиторий.Проверить(Клиент.имя пользователя, Клиент.пароль); если (результат!= ноль) { ModelState.AddModelError(string.Empty, «Имя пользователя и/или пароль уже существует! Пожалуйста, выберите другое.»); } еще { Client.photoPath = сотрудникРепозиторий.ProcessUploadedFile(Фото); var newid = сотрудникРепозиторий.InsertClient(Client.ClientName, Client.username, Client.password, Client.photoPath); // Перенаправление на страницу профиля пользователя return RedirectToPage("/Profile", new {id = newid}); } } еще { строка filePath = Path.Combine(webhostenvironment.WebRootPath, «изображения», Client.photoPath); System.IO.File.Delete(путь к файлу); // Сохраняем новую фотографию в папке wwwroot/images и обновляем // Свойство PhotoPath объекта сотрудника Client.photoPath = сотрудникРепозиторий.ProcessUploadedFile(Фото); var newid = сотрудникРепозиторий.UpdateClient(Client.ClientId, Client.ClientName, Client.username, Client.password, Client.photoPath); return RedirectToPage("/Profile", new {id = newid}); } } поймать (ArgumentNullException ex) { foreach (var modelStateKey в ModelState.Keys) { foreach (ошибка var в ModelState[modelStateKey].Errors) { ModelState.AddModelError(string.Empty, $"Это в catch: {modelStateKey}: {error.ErrorMessage}"); } } ModelState.AddModelError(string.Empty, $"Это в catch: {ex.Message}"); } // Аутентификация не удалась, возвращаемся на страницу входа вернуть страницу(); } который вставляет или обновляет записи в базе данных в зависимости от того, имеет ли параметр OnPost id значение. Если его нет, пользователь создает новый профиль; если есть, пользователь обновляет существующий.
Ниже приведен код внешнего интерфейса:
@page "/SignUp/{id:min(1)?}" @model ActualProject.Pages.SignUpModel @{ ViewData["title"] = "Регистрация"; ViewData["ShowName"] = правда; вар pageHeader = Model.Client!= null? "/Профиль" : "/Логин"; var buttonText = pageHeader == "/Profile" ? «Вернуться к профилю»: «Вернуться к входу»; var buttonText2 = buttonText == "Вернуться к профилю" ? «Обновить»: «Зарегистрироваться»; } Зарегистрироваться @if (Model.Client != null && Model.Client.ClientId != null) { } Нажмите здесь, чтобы изменить фотографию @buttonText @buttonText2 @section Скрипты { } А оставшийся код — это частичное представление «_LoginFieldsPartial»:
@model Клиент @{ вар showName = (bool)ViewData["ShowName"]; } @if (показатьимя) { Ваше имя } Проблема
Вставка записей работает безупречно; именно обновление записей приводит к ошибкам. В частности, значения в частичном представлении не являются обязательными и вместо этого передают нулевые значения. Это функция обновления:
public Client UpdateClient (int clientId, строковое имя клиента, строковое имя пользователя, строковый пароль, строковый путь к файлу) { вар существующийКлиент = контекст.Клиенты.Найти(clientId); если (existingClient!= ноль) { // Обновляем свойства новыми значениями существующийКлиент.ИмяКлиента = имя_клиента; существующийКлиент.имя_пользователя = имя пользователя; существующийКлиент.пароль = пароль; существующийClient.photoPath = путь к файлу; context.SaveChanges(); } вернуть существующий клиент; } Ошибка вызвана context.SaveChanges();; когда я проверил отладчик, все мои значения ClientName, имени пользователя и пароля были null. Я в замешательстве, потому что как я уже сказал, вставка записей работает без нареканий; все значения привязаны правильно, за исключением Client.ClientId (поскольку предполагается, что отсутствие ClientId означает, что пользователь создает новый профиль).
Когда я захожу на страницу регистрации с помощью идентификатора, значения из переменной Client в OnGet() отображаются в полях частичного просмотра. Почему-то только во время обновления поля ввода в частичном представлении не являются обязательными. Я также пробовал использовать ModelStates, но та же ошибка не исчезла, поэтому я их удалил.
Любые советы приветствуются.
У меня есть внутренний код:
частный только для чтения IEmployeeRepository сотрудникРепозиторий; частный контекст AppDbContext только для чтения; частная среда веб-хоста IWebHostEnvironment только для чтения; [BindProperty] общественный клиентский клиент {get; набор; } [BindProperty] public IFormFile Photo {get; набор; } public SignUpModel (IEmployeeRepository сотрудникРепозиторий, контекст AppDbContext, среда веб-хоста IWebHostEnvironment) { this.employeeRepository = сотрудникRepository; this.context = контекст; this.webhostenvironment = webhostenvironment; } общедоступный IActionResult OnGet (int? id) { если (id.HasValue) { Клиент = сотрудникРепозиторий.GetClient(id); } вернуть страницу(); } общественный IActionResult OnPost (int? id) { пытаться { если (!id.HasValue) { ModelState.Remove("ИдентификаторКлиента"); ModelState.Remove("photoPath"); если (ModelState.IsValid) { результат вар = сотрудникРепозиторий.Проверить(Клиент.имя пользователя, Клиент.пароль); если (результат!= ноль) { ModelState.AddModelError(string.Empty, «Имя пользователя и/или пароль уже существует! Пожалуйста, выберите другое.»); } еще { Client.photoPath = сотрудникРепозиторий.ProcessUploadedFile(Фото); var newid = сотрудникРепозиторий.InsertClient(Client.ClientName, Client.username, Client.password, Client.photoPath); // Перенаправление на страницу профиля пользователя return RedirectToPage("/Profile", new {id = newid}); } } еще { строка filePath = Path.Combine(webhostenvironment.WebRootPath, «изображения», Client.photoPath); System.IO.File.Delete(путь к файлу); // Сохраняем новую фотографию в папке wwwroot/images и обновляем // Свойство PhotoPath объекта сотрудника Client.photoPath = сотрудникРепозиторий.ProcessUploadedFile(Фото); var newid = сотрудникРепозиторий.UpdateClient(Client.ClientId, Client.ClientName, Client.username, Client.password, Client.photoPath); return RedirectToPage("/Profile", new {id = newid}); } } поймать (ArgumentNullException ex) { foreach (var modelStateKey в ModelState.Keys) { foreach (ошибка var в ModelState[modelStateKey].Errors) { ModelState.AddModelError(string.Empty, $"Это в catch: {modelStateKey}: {error.ErrorMessage}"); } } ModelState.AddModelError(string.Empty, $"Это в catch: {ex.Message}"); } // Аутентификация не удалась, возвращаемся на страницу входа вернуть страницу(); } который вставляет или обновляет записи в базе данных в зависимости от того, имеет ли параметр OnPost id значение. Если его нет, пользователь создает новый профиль; если есть, пользователь обновляет существующий.
Ниже приведен код внешнего интерфейса:
@page "/SignUp/{id:min(1)?}" @model ActualProject.Pages.SignUpModel @{ ViewData["title"] = "Регистрация"; ViewData["ShowName"] = правда; вар pageHeader = Model.Client!= null? "/Профиль" : "/Логин"; var buttonText = pageHeader == "/Profile" ? «Вернуться к профилю»: «Вернуться к входу»; var buttonText2 = buttonText == "Вернуться к профилю" ? «Обновить»: «Зарегистрироваться»; } Зарегистрироваться @if (Model.Client != null && Model.Client.ClientId != null) { } Нажмите здесь, чтобы изменить фотографию @buttonText @buttonText2 @section Скрипты { } А оставшийся код — это частичное представление «_LoginFieldsPartial»:
@model Клиент @{ вар showName = (bool)ViewData["ShowName"]; } @if (показатьимя) { Ваше имя } Проблема
Вставка записей работает безупречно; именно обновление записей приводит к ошибкам. В частности, значения в частичном представлении не являются обязательными и вместо этого передают нулевые значения. Это функция обновления:
public Client UpdateClient (int clientId, строковое имя клиента, строковое имя пользователя, строковый пароль, строковый путь к файлу) { вар существующийКлиент = контекст.Клиенты.Найти(clientId); если (existingClient!= ноль) { // Обновляем свойства новыми значениями существующийКлиент.ИмяКлиента = имя_клиента; существующийКлиент.имя_пользователя = имя пользователя; существующийКлиент.пароль = пароль; существующийClient.photoPath = путь к файлу; context.SaveChanges(); } вернуть существующий клиент; } Ошибка вызвана context.SaveChanges();; когда я проверил отладчик, все мои значения ClientName, имени пользователя и пароля были null. Я в замешательстве, потому что как я уже сказал, вставка записей работает без нареканий; все значения привязаны правильно, за исключением Client.ClientId (поскольку предполагается, что отсутствие ClientId означает, что пользователь создает новый профиль).
Когда я захожу на страницу регистрации с помощью идентификатора, значения из переменной Client в OnGet() отображаются в полях частичного просмотра. Почему-то только во время обновления поля ввода в частичном представлении не являются обязательными. Я также пробовал использовать ModelStates, но та же ошибка не исчезла, поэтому я их удалил.
Любые советы приветствуются.
Мобильная версия