MVC Form Method= 'Post' con due pulsanti di invio
-
21-12-2019 - |
Domanda
Ho rivisto diversi post qui per una soluzione. Proverò una domanda fresca.
My Modum:
<form method="post" action="@Url.Action("Manage")" data-cs-ajax="true" data-cs-target="#catalogList" >
.
Ha un campo completo completo e il paging, molto simile all'esempio di OdetoDood da Scott Allen.
C'è:
<input type="submit" value="Update" class="btn btn-default" />
.
Che aggiorna alcuni elementi filtrati da selezionati da - tutti i lavori grandi - e anche:
<input type="submit" name="btnSave" id="btnSave" value="Save" class="btn btn-default" />
.
Entrambi hanno colpito con successo:
//POST: /WebCatalog/Manage/5
[HttpPost, ActionName("Manage")]
[ValidateAntiForgeryToken]
public ActionResult Manage([Bind(Include = "Id,CatalogId,CatalogColourId,CatalogSizeId,CatalogCategoryId,CatelogSupplierId,StartDate,EndDate,Active,isSubmitted")] WebCatalogViewModel model, string searchTerm = null, int page = 1)
{ ...
.
Hanno colpito l'azione del controller a causa del JavaScript:
$(function () {
var ajaxFormSubmit = function () {
var $form = $(this);
var options = {
url: $form.attr("action"),
type: $form.attr("method"),
data: $form.serialize()
};
$.ajax(options).done(function (data) {
var $target = $($form.attr("data-cs-target"));
var $newHtml = $(data);
$target.replaceWith($newHtml);
var options = {};
$newHtml.effect("highlight", options, 500, doneEffect);
});
return false;
};
.
Ora ...
Voglio impostare un campo nel modello per consentire al controller conosci il pulsante Secondo BtnSave, è stato cliccato ... per salvare il record, ovviamente ....
soo ...
$(function () {
$("#btnSave").click(function () {
$("isSubmitted").val("1");
return true;
});
});
.
E che gli incendi: prima che la pagina viene inviata tramite Ajax in AjaxFormSubmit, il codice JQuery Codice per $ (# BTNSave ") si accende con successo.
Tuttavia, nell'azione del controller, iscrittata è sempre 0.
Ho provato:
$("isSubmitted").val(1);
.
Ho provato il modulo come metodo= 'Get' e non è ancora post - Anche se, potrei provare a cambiare il metodo con JavaScript nella funzione BTNSave.Click JS - non è sicuro di come farlo ... se Non riesco a salvare un valore in un controllo del modulo, allora perché sarei in grado di cambiare il metodo del modulo ??
Ho provato un $ ajax.actionLink - ma ottieni sempre un errore di 500 IIS.
Fondamentalmente, ho bisogno di un modo per sapere che l'utente ha fatto clic sul pulsante Salva, anziché il pulsante Aggiorna.
Qualsiasi consiglio è apprezzato!
Soluzione
@Robert Achmann, ecco la mia risposta
Sembra che il selettore in $ ("issbmitted") manca, ad es.$ ("# issinato") per un input con un ID issinato.
Altri suggerimenti
Non è necessario un valore nascosto per dire al controller quale pulsante è stato cliccato.Ciò che devi fare è nominare i 2 pulsanti come segue
<input type="submit" name="btnAction" value="Update" class="btn btn-default" />
<input type="submit" name="btnAction" value="Save" id="btnSave" class="btn btn-default" />
.
Come puoi vedere, hanno lo stesso nome ma valori diversi (aggiornamento VS Salva).
Nel controller, aggiungere un altro parametro chiamato btnAction
, che è il nome dei pulsanti, all'azione.
[HttpPost, ActionName("Manage")]
[ValidateAntiForgeryToken]
public ActionResult Manage(string btnAction, [Bind(Include = "Id,CatalogId,CatalogColourId,CatalogSizeId,CatalogCategoryId,CatelogSupplierId,StartDate,EndDate,Active,isSubmitted")] WebCatalogViewModel model, string searchTerm = null, int page = 1)
{
if(btnAction.ToLower() == "save")
{
// The save button was clicked
}
else if(btnAction.ToLower() == "update")
{
// The update button was clicked
}
else
{
// default ...
}
}
.
Fondamentalmente, il parametro btnAction
otterrà il valore del pulsante di invio attivando il modulo per ottenere post.
Spero che questo aiuto.
È possibile un campo nascosto nel modulo per memorizzare il valore di quale campo è stato cliccato (controllandolo con i gestori di eventi jquery) e per questo è possibile creare il pulsante Pulsante="Pulsante" anziché Type="Invia" (Per inviare il modulo dal tuo codice jQuery) o puoi utilizzare EventpreventDefault.
Bene, ecco un campione di codice che potrebbe aiutarti:
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js">
</script>
<script>
$(document).ready(function(){
$("#bt1").click(function(){
alert(' Save button');
$("#operation").val('save');
$("#frm").submit();
});
$("#bt2").click(function(){
alert(' Update button');
$("#operation").val('update');
$("#frm").submit();
});
});
</script>
</head>
<body>
<form id="frm">
<div id="div1"><h2> Form buttons - What of then was clicked? </h2></div>
<button id="bt1"> Save button </button>
<button id="bt2"> Update button </button>
<input type="hidden" id="operation" name="operation" value=""/>
</form>
</body>
</html>
.