Razor Pages - Prevent Overposting
Si las clases contienen secretos, aunque estos no se muestren en la web, hay maneras de introducir datos en un Creation aunque el form no tenga un campo para ello.
Ejemplo de clase con secretos Student.cs
public class Student
{
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
// an atacker may set a Secret on creation ...
public string Secret { get; set; }
// ... or he may enroll the Student in Courses he shouldn't
public ICollection<Enrollment> Enrollments { get; set; } = [];
}
Hay varias alternativas para evitar esto:
- Usar ViewModels
- Usar
TryUpdateModelAsync
ViewModels
Una buena práctica es usar ViewModels (se puede meter en la misma Student.cs)
public class StudentVM
{
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
}
Y operamos a través del ViewModel en las vistas para crear un nuevo Student, por lo que no pueden meter un secreto ni otras relaciones.
[BindProperty]
public StudentVM StudentVM { get; set; }
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
var entry = _context.Add(new Student());
entry.CurrentValues.SetValues(StudentVM);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
Para que esto funcione las clases no tienen porque estar relacionadas, pero sus properties si que tienen que ser iguales.



