ASP.NET MVC ActionLink e metodo post

Qualcuno può dirmi come posso inviare i valori a Controller usando il metodo ActionLink e POST?
Non voglio usare i pulsanti.
Immagino che abbia qualcosa con jquery.

Non è ansible utilizzare un ActionLink perché ciò rende solo un tag ancoraggio.
Puoi usare un post AJAX jQuery .
Oppure chiama semplicemente il metodo submit del form con o senza jQuery (che sarebbe non-AJAX), forse nell’evento onclick di qualsiasi controllo ti piaccia.

Se si utilizza ASP MVC3, è ansible utilizzare Ajax.ActionLink (), che consente di specificare un metodo HTTP che è ansible impostare su “POST”.

Puoi usare jQuery per fare un POST per tutti i tuoi pulsanti. Basta dare loro lo stesso nome CssClass.

Usa “return false;” alla fine dell’evento javascript onclick se si desidera eseguire RedirectToAction lato server dopo il post, altrimenti restituire la vista.

Codice del razor

 @using (Html.BeginForm()) { @Html.HiddenFor(model => model.ID) @Html.ActionLink("Save", "SaveAction", "MainController", null, new { @class = "saveButton", onclick = "return false;" }) } 

Codice JQuery

 $(document).ready(function () { $('.saveButton').click(function () { $(this).closest('form')[0].submit(); }); }); 

C #

 [AcceptVerbs(HttpVerbs.Post)] public ActionResult SaveAction(SaveViewModel model) { // Save code here... return RedirectToAction("Index"); //return View(model); } 

@Aidos ha avuto la risposta giusta voluta semplicemente chiarire poiché è nascosta all’interno di un commento sul suo post fatto da @CodingWithSpike.

 @Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" }) 

ActionLink non sparerà mai. Attiva sempre la richiesta GET.

Ecco una risposta inserita nel progetto ASP.NET MVC 5 predefinito. Credo che soddisfi bene i miei obiettivi di stile nell’interfaccia utente. Modulo inviare utilizzando javascript puro per alcuni modulo contenente.

 @using (Html.BeginForm("Logout", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" })) {  Sign out  } 

Il caso d’uso completamente mostrato è un menu a discesa di disconnessione nella barra di navigazione di un’app Web.

 @using (Html.BeginForm("Logout", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" })) { @Html.AntiForgeryToken()  } 

Usa il seguente link Call the Action:

 <%= Html.ActionLink("Click Here" , "ActionName","ContorllerName" )%> 

Per l’invio dei valori del modulo utilizzare:

  <% using (Html.BeginForm("CustomerSearchResults", "Customer")) { %>   <% } %> 

Inoltrerà i dati al responsabile del cliente e all’azione CustomerSearchResults.

Usa questo link all’interno di Ajax.BeginForm

 @Html.ActionLink( "Save", "SaveAction", null, null, onclick = "$(this).parents('form').attr('action', $(this).attr('href'));$(this).parents('form').submit();return false;" }) 

😉

La mia soluzione a questo problema è abbastanza semplice. Ho una pagina che fa una ricerca del cliente una dall’intera e-mail e l’altra da una parte, le estrazioni parziali e visualizza un elenco l’elenco ha un link azione che punta a un action result chiamato GetByID e passa nell’id

il GetByID estrae i dati per il cliente selezionato, quindi restituisce

 return View("Index", model); 

che è il metodo post

Questo è stato un problema difficile da risolvere. Come posso creare un collegamento dinamico in razor e html in grado di chiamare un metodo di azione e passare un valore o valori a un metodo di azione specifico? Ho preso in considerazione diverse opzioni tra cui un helper html personalizzato. Ho appena trovato una soluzione semplice ed elegante.

La vista

 @model IEnumerable @using (Html.BeginForm()) {  @foreach (Product p in Model.Products) {  } 
Name Price Quantity
@p.Name @p.Price.ToString() @p.Quantity.ToString()
}

Il metodo di azione

 public ViewResult Edit(Product prod) { ContextDB contextDB = new ContextDB(); Product product = contextDB.Products.Single(p => p.ProductID == prod.ProductId); product = prod; contextDB.SaveChanges(); return View("Edit"); } 

Il punto qui è che Url.Action non si preoccupa se il metodo di azione è un GET o un POST. Accederà ad entrambi i tipi di metodo. Puoi passare i tuoi dati al metodo di azione usando

 https://stackoverflow.com/questions/2048778/asp-net-mvc-actionlink-and-post-method/@Url.Action(string actionName, string controllerName, object routeValues) 

l’object routeValues. Ho provato questo e funziona. No, non stai tecnicamente facendo un post o inviando il modulo ma se l’object routeValues ​​contiene i tuoi dati, non importa se è un post o un get. È ansible utilizzare una particolare firma del metodo di azione per selezionare il metodo giusto.

Questa è la mia soluzione per il problema. Questo è un controller con 2 metodi di azione

 public class FeedbackController : Controller { public ActionResult Index() { var feedbacks =dataFromSomeSource.getData; return View(feedbacks); } [System.Web.Mvc.HttpDelete] [System.Web.Mvc.Authorize(Roles = "admin")] public ActionResult Delete([FromBody]int id) { return RedirectToAction("Index"); } } 

Nella vista rendo il costrutto seguendo la struttura.

  ..   @using (Html.BeginForm("Delete", "Feedback", FormMethod.Post, new { id = "myForm" })) { @Html.HttpMethodOverride(HttpVerbs.Delete) @Html.Hidden("id",null,new{id="idField"}) foreach (var feedback in @Model) { if (User.Identity.IsAuthenticated && User.IsInRole("admin")) { @Html.ActionLink("Delete Item", "", new { id = @feedback.Id }, new { onClick = "confirmDelete("+feedback.Id+");return false;" }) } } ...  

Punto di interesse in Razor View :

  1. Funzione JavaScript confirmDelete(id) che viene chiamata quando si fa clic sul collegamento generato con @Html.ActionLink ;

  2. confirmDelete() funzione richiesta id dell’elemento su cui si fa clic. Questo elemento è passato dal gestore onClick confirmDelete("+feedback.Id+");return false; Il gestore dell’attenzione paga restituisce false per impedire l’azione predefinita, ovvero ottenere la richiesta di destinazione. OnClick evento OnClick per i pulsanti può essere collegato con jQuery per tutti i pulsanti nell’elenco come alternativa (probabilmente lo sarà ancora di più, in quanto sarà meno testo nella pagina HTML e i dati potrebbero essere passati tramite attributo data- ).

  3. Il modulo ha id=myForm , per trovarlo in confirmDelete() .

  4. Il modulo include @Html.HttpMethodOverride(HttpVerbs.Delete) per utilizzare il verbo HttpDelete , come azione contrassegnata con HttpDeleteAttribute .

  5. Nella funzione JS io uso la conferma dell’azione (con l’aiuto del plugin esterno, ma anche la conferma standard funziona bene. Non dimenticare di usare bind() in call back o var that=this (qualunque cosa tu preferisca).

  6. Il modulo ha un elemento nascosto con id='idField' e name='id' . Quindi, prima che il modulo venga inviato dopo la conferma ( result==true ), il valore dell’elemento nascosto viene impostato sull’argomento valore passato e il browser invierà i dati al controller in questo modo:

URL richiesta : http://localhost:38874/Feedback/Delete

Metodo di richiesta : codice di stato POST: 302 trovato

Intestazioni di risposta

Posizione: / Feedback Host: localhost: 38874 Dati modulo X-HTTP-Metodo-Override: DELETE id: 5

Come si vede è la richiesta POST con X-HTTP-Method-Override: DELETE e dati nel body impostati su “id: 5”. La risposta ha il codice 302 che reindirizza all’azione Index, da questo si aggiorna lo schermo dopo l’eliminazione.

Al fine di POST è necessario inviare i dati del modulo. Non penso sia ansible farlo con un ActionLink. Dai un’occhiata a questo link .

Consiglierei di rimanere puro ai principi REST e di usare una cancellazione HTTP per le tue eliminazioni. Sfortunatamente le specifiche HTML hanno solo HTTP Get & Post. Solo un tag può ottenere un Get HTTP. Un tag form può fare un HTTP Get o Post. Fortunatamente se usi ajax puoi fare un HTTP Delete e questo è quello che raccomando. Vedere il seguente post per i dettagli: Elimina Http

Ho fatto lo stesso problema usando il seguente codice:

 @using (Html.BeginForm("Delete", "Admin")) { @Html.Hidden("ProductID", item.ProductID)  } 

Chiamare $ .post () non funzionerà poiché è basato su Ajax. Quindi un metodo ibrido deve essere usato per questo scopo.

Di seguito è la soluzione che sta funzionando per me.

Passaggi: 1. Crea l’URL per href che chiama il metodo con url e parametro 2. Chiama il POST normale usando il metodo JavaScript

Soluzione:

In .cshtml:

 View 

Nota: il metodo anonimo dovrebbe essere racchiuso tra (….) () es

 (function() { //code... })(); 

postGo è definito come in seguito in JavaScript. Il rest è semplice ..

@ Url.Action (“View”) crea l’url per la chiamata

{‘id’: @ receipt.ReceiptId} crea parametri come object convertito a turno nei campi POST nel metodo postGo. Questo può essere qualsiasi parametro come richiesto

In JavaScript:

 (function ($) { $.extend({ getGo: function (url, params) { document.location = url + '?' + $.param(params); }, postGo: function (url, params) { var $form = $("
") .attr("method", "post") .attr("action", url); $.each(params, function (name, value) { $("") .attr("name", name) .attr("value", value) .appendTo($form); }); $form.appendTo("body"); $form.submit(); } }); })(jQuery);

URL di riferimento che ho usato per postGo

GET / POST non Ajax utilizzando jQuery (plugin?)

http://nuonical.com/jquery-postgo-plugin/

jQuery.post() funzionerà se si dispone di dati personalizzati. Se si desidera inviare un modulo esistente, è più semplice utilizzare ajaxSubmit() .

E non è necessario impostare questo codice nello stesso ActionLink , poiché è ansible colbind il gestore di collegamenti all’evento document.ready() (che è comunque un metodo preferito), ad esempio utilizzando $(function(){ ... }) trucco jQuery.

È venuto attraverso questo bisogno di POST da una pagina di ricerca (indice) alla pagina dei risultati. Non ho avuto bisogno di quanto affermato da @Valiy, ma mi ha indirizzato nella giusta direzione. Tutto quello che dovevo fare era questo:

 @using (Html.BeginForm("Result", "Search", FormMethod.Post)) { 
Search Term:

}

Il mio controller aveva il seguente metodo di firma:

 [HttpPost] public async Task Result(string k)