Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

285
Vistas
Problema principal de ASP.net AntiForgeryToken: los datos no se vinculan al modelo

Tengo un proyecto de trabajo para un sistema de reservas en el núcleo de asp.net que utiliza un gráfico de línea de tiempo de Google. Cuando hace clic en el gráfico, aparece una ventana emergente modal con una vista parcial para ingresar datos. Javascript tiene un evento de clic en el botón Guardar para enviar los datos al controlador. El controlador valida los datos y envía la vista parcial a javascript, donde se envía de nuevo a la ventana emergente modal. Tengo dos indicadores en la vista que, si se establece en verdadero, javascript oculta la ventana emergente. Todo esto funciona hasta que decoro el controlador con [ValidateAntiForgeryToken]

tengo el codigo de la siguiente manera


Puesta en marcha:

 services.AddAntiforgery(options => { options.HeaderName = "RequestVerificationToken"; });

JavaScript:

 (function() { var PlaceHolderElement = $('#PlaceHolderHere'); //create popup save PlaceHolderElement.on('click', '[data-save="modal"]', function(event) { event.preventDefault(); var form = $(this).parents('.modal').find('form'); var token = $("input[name='__RequestVerificationToken']").val(); var actionUrl = form.attr('action'); var sendData = form.serialize(); $.ajax({ type: 'POST', url: actionUrl, data: sendData, }).done(function(data1) { var newBody = $('.modal-body', data1); PlaceHolderElement.find('.modal-body').replaceWith(newBody); var isValid = newBody.find('[name="IsValid"]').val() === 'True'; var isValid2 = newBody.find('[name="BookingFree"]').val() === 'True'; if (isValid && isValid2) { PlaceHolderElement.find('.modal').modal('hide'); location.reload(); } }) })

Controlador:

 [HttpPost] public IActionResult EditBooking(BookingViewModel model) { if (ModelState.IsValid) { ... other code } }

cuando decoro el controlador con [ValidateAntiForgeryToken] y cambio el jarvascript a

 data: { model: sendData, __RequestVerificationToken: token, }

¡Validar funciona pero el modelo está vacío! si declaro el modelo como una cadena, obtengo una cadena.

Si envío el token en encabezados:, la validación del token falla

Necesito los datos en el modelo para que ModelState establezca IsValid

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

1. .serialize() pasará los datos del formulario junto con el valor __RequestVerificationToken de forma predeterminada.

2. Cuando use el elemento de formulario con method="post" y el asistente de etiquetas, generará dinámicamente una entrada de token cuyo name="__RequestVerificationToken" dentro del formulario. Pero si especifica el atributo de action para el formulario como: <form action="/url" method="post"></form> , no generará la entrada del token.

Entonces, si especifica el atributo de action , debe agregar manualmente la entrada del token usando @Html.AntiForgeryToken() en el formulario:

 <form action="/url" method="post"> @Html.AntiForgeryToken() //.... </form>

Una demostración de trabajo simple que podría seguir:

Vista:

 <form asp-action="EditBooking" asp-controller="Home" method="post"> <input asp-for="Name" /> <input type="button" onclick="PostForm()" value="Post" /> </form> @section Scripts { <script> function PostForm() { //var token = $("input[name='__RequestVerificationToken']").val(); var actionUrl = $('form').attr('action'); var sendData = $('form').serialize(); console.log(sendData) $.ajax({ type: 'POST', url: actionUrl, data: sendData, }).done(function(data1) { }) } </script> }

Y no es necesario agregar el siguiente código:

 services.AddAntiforgery(options => { options.HeaderName = "RequestVerificationToken"; });
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda