Ваш код выглядит в целом правильно, но есть несколько моментов, которые могут вызывать проблему с ошибкой 400 (Bad Request). Разберем возможные причины и как их исправить.
Проблемы с именами свойств: В вашем JavaScript коде вы используете name и password, но в классе User они объявлены как Name и Password (с заглавной буквы). Core использует регистронезависимое сопоставление, но в данном случае, возможно, лучше использовать атрибут JsonPropertyName для явного указания, как ваши свойства должны называться при сериализации и десериализации JSON. Вы уже сделали это, но имейте в виду, что в JavaScript вы должны использовать правильные имена.
Измените часть вашего JavaScript кода:
const user = {
name: document.getElementById("login").value,
password: password
};
на
const user = {
Name: document.getElementById("login").value,
Password: password
};
Атрибуты в модели: Убедитесь, что у вас есть соответствующие пространства имен для атрибутов, таких как [Required] и [JsonPropertyName]. Вам нужно импортировать соответствующие пространства имен:
using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
Метод OnPost: Ваша модель пользователя User уже привязана к BindProperty. Это означает, что вы не должны использовать [FromBody] в параметрах метода OnPost. Измените сигнатуру метода:
public IActionResult OnPost()
{
try
{
if (User == null ||
string.IsNullOrEmpty(
User.Name ) ||
string.IsNullOrEmpty(User.Password))
{
return BadRequest(new { success = false, message = "Invalid data." });
}
usersList.Add(User);
Console.WriteLine($"User added: {
User.Name }");
return new JsonResult(new { success = true });
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
return StatusCode(500, new { success = false, message = ex.Message });
}
}
Проверка на клиенте: Убедитесь, что на клиенте вы отправляете корректный JSON. Если вы все же хотите использовать name и password, тогда соответствующим образом измените атрибуты в классе User.
Проверка на ошибки: Также, если у вас есть настройки валидации, убедитесь, что вы не получаете дополнительные ошибки из-за валидации модели.
Применив эти изменения, вы должны решить проблему с ошибкой 400. Если ошибка все еще возникает, включите логирование и проверьте сообщения об ошибках в консоли браузера и в серверных журналах.
{
private static readonly List<User> usersList = new List<User>();
public void OnGet()
{
}
[BindProperty]
public User User { get; set; }
public IActionResult OnPost([FromBody] User user)
{
try
{
if (user == null ||
string.IsNullOrEmpty( user.Name ) ||
string.IsNullOrEmpty(user.Password))
{
return BadRequest(new { success = false, message = "Invalid data." });
}
usersList.Add(user);
Console.WriteLine($"User added: { user.Name }");
return new JsonResult(new { success = true });
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
return StatusCode(500, new { success = false, message = ex.Message });
}
}
}<script>
function validateForm(event) {
event.preventDefault();
const password = document.getElementById("password").value;
const password1 = document.getElementById("password1").value;
if (password !== password1) {
alert("Пароли не совпадают!");
return;
}
const user = {
name: document.getElementById("login").value,
password: password
};
console.log(user);
fetch('/Registration', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(user)
})
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! Status code: ${response.status}`);
}
return response.json();
})
.then(data => {
console.log(data);
window.location.href = '/Success';
})
.catch(error => {
console.error('Error:', error);
alert(error.message);
});
}
</script> public class User
{
[Required]
[JsonPropertyName("name")]
public string Name { get; set; }
[Required]
[JsonPropertyName("password")]
public string Password { get; set; }
}