Pregunta

Tengo una situación en la que estoy enviando datos a un controlador a través de jQuery $ .ajax, los datos es una cadena JSON serializado. (MVC 3.0)

Se une que bien - mi controlador recibe los resultados y que son correctos. Ahora bien, estoy teniendo un problema con él la publicación posterior validación. Sospecho que se debe a que no todos mis objetos están obligados a controles de formulario de forma nativa.

El problema es que tengo a 'añadir' datos a mi modelo usando javascript, debido a que el modelo requiere un elemento de una colección. El uso de JavaScript, jQuery, y templating, tengo este elemento seleccionado, y lo añado al modelo antes de que lo envía al controlador. Sin embargo en la devolución de datos, estos datos no está presente (que se espera, ya que tendría que deserializar en la matriz de JavaScript - que no es mi problema).

Mi problema es que realiza una doble devolución de datos para la validación, o ninguno en absoluto. Si uso e.preventDefault(); para detener la forma normal de mensajes, nunca consigo la validación. Pero si yo no uso eso, entonces siempre obtener una doble post, que termina en mi opinión nunca se redirigir.

Mi código de jQuery es la siguiente ..

   $('form').submit(function(e){

    var data = $('form').serializeObject();
    data.Quality = // this line adds some data from a JSON object.

    var json = JSON.stringify(data);

    $.ajax({
      url: location.href,
      type: 'POST',
      dataType: 'json',
      data: json,
      contentType: 'application/json',
      success: function (data) {
       $("#jsonOutput").html(json);
      }
    });

    e.preventDefault();
   });

Esta es la función serializeObject.

$.fn.serializeObject = function () {
 var o = {};
 var a = this.serializeArray();
 $.each(a, function () {
  if (o[this.name]) {
   if (!o[this.name].push) {
    o[this.name] = [o[this.name]];
   }
   o[this.name].push(this.value || '');
  } else {
   o[this.name] = this.value || '';
  }
 });
 return o;
};

Aquí está mi Acción controlador.

  [HttpPost]
  public ActionResult Blueprint(Blueprint blueprint)
  {
   if (ModelState.IsValid)
   {
    using (var context = new Mapping.DataContext())
    {
     context.Blueprints.Add(blueprint);
     context.SaveChanges();

     return Json(Redirect("/List/Blueprints")); 
    }
   }

   return View(blueprint);
  }

Me publicará más de código si se solicita, sin embargo creo que esto es todo lo que es relevante. Estoy utilizando el knockoutjs biblioteca para la plantilla, si eso es en absoluto relevante. Por favor, dime qué más necesita para ver si es aplicable.

¿Fue útil?

Solución

 $("#jsonOutput").html(json);

En cuanto a la doble post va, esto está sucediendo porque la solicitud sea presentada por el controlador de eventos y la forma real presentara. Para deshacerse de este problema, usted quiere algo como esto:

$('form').submit(function(e){

    var data = $('form').serializeObject();
    data.Quality = // this line adds some data from a JSON object.

    var json = JSON.stringify(data);

    $.ajax({
      url: location.href,
      type: 'POST',
      dataType: 'json',
      data: json,
      contentType: 'application/json',
      success: function (data) {
       $("#jsonOutput").html(json);
      }
    });

    return false;
   });

false retorno, le dirá al evitar que el evento que se está procesando por la forma como se le está diciendo al sistema que se maneja ya.

El otro problema que veo con lo que está haciendo, que está solicitando JSON mediante el establecimiento Tipo de datos: 'json' Esto significa que su solicitud está esperando un objeto JSON, y en el caso falla la validación, se están volviendo una vista completa . Esto probablemente no es lo que quiere hacer.

También Nota:

$("#jsonOutput").html(json);

¿Qué se está llamando en respuesta exitosa se está cargando el valor de la JSON para enviar con su solicitud y no los datos de la respuesta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top