Estou tendo um problema estranho aqui. Estou fazendo o tutorial do Microsoft's Razor e EF e não sei o que há de errado com este código:
public class Student
{
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; }
}
//CRUD Create Method
public async Task<IActionResult> OnPostAsync()
{
var emptyStudent = new Student();
if (await TryUpdateModelAsync<Student>(
emptyStudent,
"Student",
s => s.FirstMidName,
s => s.LastName,
s => s.EnrollmentDate))
{
_context.Students.Add(emptyStudent);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
return Page();
}
O formulário é o seguinte:
<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>
Eu depurei e analisei o tráfego. Eu sei que estou recebendo o formulário com os valores e, na verdade, usando Request.Form["student.FirstMidName"]
e assim por diante, eu posso preencher emptyStudent
.
Ainda não entendi o que está errado, já que o código, aparentemente, está bom. No entanto, TryUpdateModelAsync
está retornando false
.
Alguma ideia do porquê isso está acontecendo?
Com base na resposta de Basheer Jarrah
O contexto anulável será habilitado por padrão desde o .net 6, você pode ver este documento
O método TryUpdateModelAsync acionará a vinculação do modelo novamente e false indica falha na vinculação do modelo. Você pode ver este documento
Você deve evitar atribuir valores de tipo complexo com lambda como:
s => s.Enrollments
outra opção além de definir a propriedade Enrollments como anulável
é desabilitar o recurso, os códigos para a página do razor:
Esse problema ocorre quando a propriedade de navegação
Enrollments
não é anulável. Com base nos documentos do ASP .NET Core para tipos não anuláveis :Então, ou você torna
Enrollments
a coleção anulável, ou a inclui no formulário eparams
noTryUpdateModelAsync()
método.