2009-04-24 12 views
13

Tengo una vista que se usa para editar cosas, por ejemplo, Pedidos. Los pedidos tienen líneas de pedido que se pueden agregar de forma arbitraria. Entonces, una vista principal y vistas parciales anidadas.Ajax.BeginForm dentro de Html.BeginForm

Cada parcial debe tener un formulario ajax para ajustar cantidades de cada elemento de línea o lo que sea.

Por lo tanto:

Html.BeginForm() 
{%> 
    Ship to: blah blah blah 
    <% 
    Ajax.BeginForm("EditLineItem", "Order", new { OrderLineItemID = Model.ObjectID }, itemAjaxOptions)) 
    { 
     Item qty blah blah blah 

     <--! (ajax form's submit button, etc.)--> 
    } 
    %> 
    <--! (ajax form's submit button, etc.)--> 
<% 
} 

Tengo un controlador que tiene este aspecto:

[ActionName("Edit")] 
[AcceptVerbs(HttpVerbs.Post)] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(int orderID) 
{ 
    blah, blah 
} 

[ActionName("EditLineItem")] 
[AcceptVerbs(HttpVerbs.Post)] 
[ValidateAntiForgeryToken] 
public ActionResult EditLineItem(Guid orderLineItemID) 
{ 
    blah, blah 
} 

Mi problema es que cuando presente la forma Ajax, consigo el método Edit en lugar de los métodos EditLineItem . Ambas rutas están mapeadas. ¿Hay algo así como "no se puede enviar un formulario Ajax dentro de un formulario Html" que yo no sepa?

Respuesta

12

Intenté exactamente lo mismo hace un tiempo. No importa lo que hice, no haría el envío de AJAX. Así que creo que la respuesta es: sí, no puede poner un botón de enviar para un formulario AJAX dentro de un formulario html regular.

Pero, ¿por qué tendría los envíos parciales combinados con los envíos completos? La solución más fácil para este imo sería usar las solicitudes JSON con jQuery.

por ejemplo, la actualización de un texto lapso cantidad cuando se cambia una lista desplegable (id = orden):

<script type="text/javascript"> 
    $(document).ready(function() { 
     $('select#Order').change(function() { 
      $.getJSON('/Orders/UpdateQty/' + this.value, {}, 
       function(data) { 
        $('#qty').html(data); 
       }); 
     }); 
    }); 

</script> 

Y el código en el "pedidos" controlador:

public class OrdersController : Controller 
{ 
    public ActionResult UpdateQty(int id) 
    { 
     return Json(yourLibrary.getQuantities(id)); 
    } 
} 

Este Link poder ayuda. Saludos

Editar:

Así que .. el enlace ya no existe. Pero gracias a la máquina de retorno de Internet, tenemos this copy :)

2

AFAIA el AjaxForm todavía se muestra como una etiqueta de formulario, por lo que estaría anidando formularios, que como ha encontrado es un no no.

Creo que Francisco está en la línea correcta (aunque sugeriría implementar una publicación en lugar de una obtener a medida que actualiza algo).

Saludos cordiales, TP

Cuestiones relacionadas