Domanda

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

È stato utile?

Soluzione

Non è possibile utilizzare un ActionLink perché solo rende un tag <a> di ancoraggio.
È possibile utilizzare un jQuery AJAX posta .
O semplicemente chiamare il modulo del metodo di invio, con o senza jQuery (che sarebbe non-AJAX), forse in caso onclick di qualsiasi controllo prende la vostra fantasia.

Altri suggerimenti

Se stai usando ASP MVC3 si potrebbe usare un Ajax.ActionLink (), che consente di specificare un metodo HTTP, che è possibile impostare su "POST".

È possibile utilizzare jQuery per fare un post per tutti i pulsanti. Basta dare loro lo stesso nome CssClass.

Con "return false;" alla fine del vostro onclick javascript evento se si vuole fare un RedirectToAction lato server dopo il post altrimenti solo restituire la vista.

Codice 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 aveva la risposta giusta voleva solo mettere in chiaro dal momento che è nascosto all'interno di un commento sul suo post fatto da @CodingWithSpike.

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

Qui c'era una risposta cotto in default ASP.NET MVC 5 progetto Credo che compie i miei obiettivi stilistici ben nell'interfaccia utente. Modulo di presentare utilizzando JavaScript puro a una qualche forma di contenimento.

@using (Html.BeginForm("Logout", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
{
   <a href="javascript:document.getElementById('logoutForm').submit()">
      <span>Sign out</span>
   </a>
}

Il caso d'uso completamente mostrata è un menu a discesa di logout nella barra di navigazione di una web app.

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

    <div class="dropdown">
        <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
            <span class="ma-nav-text ma-account-name">@User.Identity.Name</span>
            <i class="material-icons md-36 text-inverse">person</i>
        </button>

        <ul class="dropdown-menu dropdown-menu-right ma-dropdown-tray">
            <li>
                <a href="javascript:document.getElementById('logoutForm').submit()">
                    <i class="material-icons">system_update_alt</i>
                    <span>Sign out</span>
                </a>
            </li>
        </ul>
    </div>
}

ActionLink non sarà mai posta il fuoco. E 'sempre innescare GET richiesta.

Utilizza il seguente la chiamerà l'azione di collegamento:

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

Per la presentazione dei valori della form usano:

 <% using (Html.BeginForm("CustomerSearchResults", "Customer"))
   { %>
      <input type="text" id="Name" />
      <input type="submit" class="dASButton" value="Submit" />
   <% } %>

Sarà inviare i dati al controller Cliente e azione CustomerSearchResults.

Usa questo link all'interno 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 uno per tutta la posta elettronica e l'altra da un parziale, il tira parziali e visualizza un elenco della lista ha un collegamento un'azione che punta a un ActionResult chiamato GetByID e passa l'id

il GetByID tira i dati per il cliente selezionato ritorna

return View("Index", model); 

che è il metodo post

Questo è stato un problema difficile da risolvere per me.Come posso creare un collegamento dinamico in rasoio e html che possa chiamare un metodo di azione e passare uno o più valori a un metodo di azione specifico?Ho preso in considerazione diverse opzioni, incluso un helper HTML personalizzato.Ho appena trovato una soluzione semplice ed elegante.

La vista

@model IEnumerable<MyMvcApp.Models.Product>

@using (Html.BeginForm()) {

     <table>
         <thead>
             <tr>
                 <td>Name</td>
                 <td>Price</td>
                 <td>Quantity</td>
            </tr>
        </thead>
        @foreach (Product p in Model.Products)
        {
            <tr>
                <td><a href="@Url.Action("Edit", "Product", p)">@p.Name</a></td>
                <td>@p.Price.ToString()</td>
                <td>@p.Quantity.ToString()</td>
            </tr>
         }
    </table>
}

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 a Url.Action non interessa se il metodo dell'azione è GET o POST.Accederà a entrambi i tipi di metodo.Puoi passare i tuoi dati al metodo di azione utilizzando

@Url.Action(string actionName, string controllerName, object routeValues)

l'oggetto routeValues.Ho provato questo e funziona.No, tecnicamente non stai scrivendo un post o inviando il modulo, ma se l'oggetto routeValues ​​contiene i tuoi dati, non importa se si tratta di un post o di un get.È possibile utilizzare una firma del metodo di azione particolare per selezionare il metodo corretto.

Ho fatto lo stesso problema utilizzando il codice seguente:

@using (Html.BeginForm("Delete", "Admin"))
{
       @Html.Hidden("ProductID", item.ProductID)
       <input type="submit" value="Delete" />
}

Questa è la mia soluzione per il problema. Questo è un controllore con 2 metodi d'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");
}
}

In vista rendo costruire seguente struttura.

<html>
..
<script src="~/Scripts/bootbox.min.js"></script>
<script>
function confirmDelete(id) {
  bootbox.confirm('@Resources.Resource.AreYouSure', function(result) {
    if (result) {
      document.getElementById('idField').value = id;
      document.getElementById('myForm').submit();
    }
  }.bind(this));
}
</script>

@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;" })
   }
  }
...
</html>

Punto di interesse in Razor Visualizza :

  1. funzione JavaScript confirmDelete(id) che viene chiamato quando il link generato con @Html.ActionLink viene cliccato;

  2. funzione confirmDelete() id necessaria di voce di essere cliccato. Questa voce è passata dal gestore onClick gestore Prestare attenzione confirmDelete("+feedback.Id+");return false; restituisce false per prevenire l'azione di default - che è richiesta get a bersaglio. evento OnClick per i pulsanti potrebbe essere collegato con jQuery per tutti i pulsanti nella lista come alternativa (probabilmente sarà ancora meglio, come lo sarà meno testo nella pagina HTML e dati potrebbero essere superato tramite l'attributo data-).

  3. Modulo ha id=myForm, al fine di trovare in confirmDelete().

  4. Modulo comprende @Html.HttpMethodOverride(HttpVerbs.Delete) al fine di utilizzare il verbo HttpDelete, come l'azione contrassegnato con la HttpDeleteAttribute.

  5. Nella funzione JS io uso la conferma azione (con l'aiuto di plugin esterno, ma conferma di serie funziona bene anche. Non dimenticare di utilizzare bind() in chiamata indietro o var that=this (quello che preferite).

  6. Modulo ha un elemento nascosto con id='idField' e name='id'. Quindi, prima il modulo viene inviato dopo la conferma (result==true), il valore dell'elemento nascosto sia impostata sul valore argomento passato e il browser presenterà i dati al controller in questo modo:

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

Richiesta Metodo : POST Codice di stato: 302 Found

Risposta intestazioni

Location: / Feedback Host: localhost: 38874 Dati modulo X-HTTP-Metodo-override: DELETE id: 5

Come si vede si tratta di richiesta POST con X-HTTP-Metodo-override: eliminare e dati in organo istituito a "id: 5". Risposta ha 302 codice che reindirizza all'azione Index, da questo si aggiorna lo schermo dopo eliminazione.

Vi consiglio di stare pura ai principi REST e utilizzando un HTTP delete per le eliminazioni. Purtroppo HTML Spec ha solo HTTP Get e Post. Un tag solo è possibile un HTTP GET. Un tag modulo può sia fare un HTTP GET o POST. Fortunatamente se si utilizza Ajax si può fare un HTTP Cancella e questo è quello che io consiglierei. Vedere il seguente post per i dettagli: Http Elimina

La chiamata $ .post () non funziona perché si basa Ajax. Quindi un metodo ibrido ha bisogno di essere utilizzato per questo scopo.

In seguito è la soluzione che sta lavorando per me.

Passi: 1. Creare URL href che chiama il metodo con l'URL e il parametro 2. Chiamare POST normale utilizzando il metodo JavaScript

Soluzione:

In .cshtml:

<a href="javascript:(function(){$.postGo( '@Url.Action("View")', { 'id': @receipt.ReceiptId  } );})()">View</a>

Nota: il metodo anonimo deve essere avvolto in (....) () cioè

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

postGo è definito come di seguito in JavaScript. Resto sono semplici ..

@ Url.Action ( "View") crea URL del richiamo

{ 'id': @ receipt.ReceiptId} crea parametri come oggetto, che è a sua volta, convertito in POST campi nel metodo postGo. Questo può essere qualsiasi parametro come si richiede

In JavaScript:

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

URL di riferimento che ho usato per postGo

non Ajax GET / POST utilizzando jQuery (plug-in?)

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

jQuery.post() funziona se si dispone di dati personalizzati. Se si desidera pubblicare modulo esistente, è più facile da usare ajaxSubmit() .

E non c'è bisogno di impostare questo codice nel ActionLink sé, dato che è possibile collegare gestore di collegamento in caso document.ready() (che è un metodo preferito in ogni caso), ad esempio utilizzando jQuery $(function(){ ... }) trucco.

sono imbattuto in questo bisogno di POST da una pagina di ricerca (Index) alla pagina dei risultati. Non avevo bisogno di quanto più @Vitaliy dichiarato ma mi ha segnalato nella giusta direzione. Tutto quello che dovevo fare era questa:

@using (Html.BeginForm("Result", "Search", FormMethod.Post)) {
  <div class="row">
    <div class="col-md-4">
      <div class="field">Search Term:</div>
      <input id="k" name="k" type="text" placeholder="Search" />
    </div>
  </div>
  <br />
  <div class="row">
    <div class="col-md-12">
      <button type="submit" class="btn btn-default">Search</button>
    </div>
  </div>
}

Il mio controller ha avuto il seguente metodo di firma:

[HttpPost]
public async Task<ActionResult> Result(string k)

Questa è tratto dal progetto di esempio MVC

@if (ViewBag.ShowRemoveButton)
      {
         using (Html.BeginForm("RemoveLogin", "Manage"))
           {
              @Html.AntiForgeryToken()
                  <div>
                     @Html.Hidden("company_name", account)
                     @Html.Hidden("returnUrl", Model.returnUrl)
                     <input type="submit" class="btn btn-default" value="Remove" title="Remove your email address from @account" />
                  </div>
            }
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top