2009-04-24 5 views
13

Ho una vista che viene utilizzata per la modifica di materiale, ad esempio Ordini. Gli ordini hanno elementi pubblicitari che possono essere aggiunti arbitrariamente. Quindi una vista principale e viste parziali nidificate.Ajax.BeginForm all'interno Html.BeginForm

Ogni partial dovrebbe avere un modulo Ajax per la regolazione di quantità di ogni elemento pubblicitario o altro.

Così:

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.)--> 
<% 
} 

Ho un controller che assomiglia a questo:

[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 
} 

Il mio problema è che quando ho presentare il modulo di Ajax, ho il metodo Edit invece dei metodi EditLineItem . Entrambi i percorsi sono mappati. C'è qualche trucco come "non puoi inviare un modulo Ajax all'interno di un modulo Html" di cui non sono a conoscenza?

risposta

12

Ho provato la stessa identica cosa qualche tempo fa. Non importa cosa ho fatto, non avrebbe inviato AJAX. Quindi penso che la risposta sia: sì, non puoi mettere un pulsante di invio per un modulo AJAX all'interno di un normale modulo html.

Ma, perché dovresti inviare somme parziali con submission completi? La soluzione più semplice a questo imo sarebbe utilizzare le richieste JSON con jQuery.

per esempio, l'aggiornamento di un testo arco quantità quando si modifica una DropDownList (id = ordine):

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

</script> 

E il codice nel controller "Ordini":

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

Questo Link forza Aiuto. Saluti

Edit:

Quindi .. il link non esiste più. Ma grazie alla macchina di wayback di internet, abbiamo this copy :)

2

AFAIA l'AjaxForm è ancora rendering come tag di modulo, quindi dovresti annidare i moduli, che come hai trovato è un no no.

Penso che Francisco sia sulla linea giusta (quindi suggerirei di implementare un post piuttosto che ottenere mentre aggiorni qualcosa).

Cordiali saluti, TP