ASP.NET MVC ActionLink and post method

Quelqu'un peut-il me dire comment soumettre des valeurs au contrôleur en utilisant ActionLink et la méthode POST?

Je ne veux pas utiliser les boutons.

Je suppose qu'il y a quelque chose avec jquery.

91
demandé sur A-Sharabiani 2010-01-12 15:15:15

17 réponses

vous ne pouvez pas utiliser un ActionLink parce que cela rend juste une ancre <a> étiquette.

Vous pouvez utiliser un jQuery AJAX post .

Ou appelez simplement la méthode submit de la forme avec ou sans jQuery (qui serait non-AJAX), peut-être dans l'événement onclick de n'importe quel contrôle prend votre fantaisie.

52
répondu AUSteve 2016-12-02 14:30:23

si vous utilisez ASP MVC3 vous pouvez utiliser un Ajax.ActionLink (), qui vous permet de spécifier une méthode HTTP que vous pouvez définir à "POST".

67
répondu Aidos 2011-05-31 07:45:57

vous pouvez utiliser jQuery pour faire un POST pour tous vos boutons. Donnez-leur juste le même nom de classe.

utilisez "return false;" à la fin de votre événement javascript onclick si vous voulez faire une redirection côté serveur après le post sinon il suffit de retourner la vue.

Razor Code

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

Code 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);
}
20
répondu Idris 2012-01-23 23:51:26

@Aidos avait la bonne réponse juste voulu le faire clair puisqu'il est caché à l'intérieur d'un commentaire sur son post fait par @CodingWithSpike.

@Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" })
13
répondu goodies4uall 2012-12-11 03:25:03

Voici une réponse fourrée dans la valeur par défaut ASP.NET projet MVC 5 je crois que cela accomplit mes objectifs de style bien dans L'UI. Formulaire soumettre en utilisant javascript pur à une certaine forme contenant.

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

le cas d'utilisation indiqué en entier est un dropdown de déconnexion dans la barre de navigation d'une application web.

@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>
}
4
répondu daniel.caspers 2017-08-02 02:01:53

ActionLink ne tirera jamais. Ça déclenche toujours une requête.

3
répondu Navish Rampal 2011-05-17 14:14:46

utilisez le lien suivant pour appeler le lien D'Action:

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

pour la soumission des valeurs de formulaire utiliser:

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

il soumettra les données au contrôleur client et CustomerSearchResults Action.

2
répondu Navish Rampal 2011-03-10 18:19:23

utilisez ce lien à L'intérieur D'Ajax.BeginForm

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

;)

1
répondu Alexey Smolyakov 2011-08-05 23:15:17

ma Solution à cette question est assez simple. J'ai une page qui fait une recherche de client un par l'e-mail entier et l'autre par un partial, le partial TIRE et affiche une liste la liste a un lien d'action qui pointe vers un résultat d'action appelé GetByID et passe dans l'id

la GetByID extrait les données pour le client sélectionné, puis retourne

return View("Index", model); 

qui est la méthode post

1
répondu DJ_PLaying 2011-11-18 18:38:13

ce fut un problème difficile à résoudre pour moi. Comment puis-je construire un lien dynamique dans razor et html qui peut appeler une méthode d'action et passer une valeur ou des valeurs à une méthode d'action spécifique? J'ai envisagé plusieurs options, y compris un helper html personnalisé. Je viens de trouver une solution simple et élégante.

La vue

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

de La méthode d'action

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");
}

le point ici est cette Url.L'Action n'est pas peu importe que la méthode d'action soit un GET ou un POST. Il accédera à l'un ou l'autre type de méthode. Vous pouvez passer vos données à la méthode d'action en utilisant

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

l'objet routeValues. J'ai essayé et ça marche. Non, vous n'êtes pas techniquement en train de faire un post ou de soumettre le formulaire mais si l'objet routeValues contient vos données, cela n'a pas d'importance si c'est un post ou un get. Vous pouvez utiliser une signature de méthode d'action particulière pour sélectionner la bonne méthode.

1
répondu wayne.blackmon 2011-12-19 17:09:04

C'est ma solution pour le problème. C'est contrôleur avec 2 méthodes d'action

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");
}
}

En Vue de rendre construire la structure suivante.

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

point d'intérêt dans Razor View :

  1. fonction JavaScript confirmDelete(id) qui s'appelle lorsque le lien généré par @Html.ActionLink est cliqué;

  2. La fonction

    confirmDelete() exigeait l'identification de l'élément cliqué. Ce poste est passé de onClick gestionnaire confirmDelete("+feedback.Id+");return false; attention gestionnaire retourne false pour empêcher l'action par défaut qui est d'obtenir la demande de la cible. OnClick événement pour les boutons pourrait être attaché avec jQuery pour tous les boutons dans la liste comme alternative (probablement il sera encore mieux, car il sera moins de texte dans la page HTML et les données pourraient être passées via data- attribut).

  3. forme a id=myForm , afin de le trouver dans confirmDelete() .

  4. inclut @Html.HttpMethodOverride(HttpVerbs.Delete) afin d'utiliser le verbe HttpDelete comme action marquée avec le HttpDeleteAttribute .

  5. dans la fonction JS j'utilise la confirmation d'action (avec l'aide de plugin externe, mais Standard confirmer fonctionne très bien aussi. N'oubliez pas d'utiliser bind() dans call back ou var that=this (tout ce que vous préférez).

  6. forme a un élément caché avec id='idField' et name='id' . Ainsi, avant que le formulaire soit soumis après confirmation ( result==true ), la valeur de l'élément caché est définie à valeur argument passé et le navigateur va soumettre des données au contrôleur comme ceci:

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

demande Méthode : Code Postal: 302 Found

En-Têtes De Réponse

Lieu: / Feedback Hôte: localhost: 38874 Form Data X-HTTP-Method-Override:DELETE id: 5

comme vous le voyez, il S'agit D'une requête POST avec X-HTTP-Method-Override:DELETE et les données dans le corps défini à"id:5". Réponse a 302 code qui redirigent vers L'action Index, par ceci vous Rafraîchissez votre écran après Supprimer.

1
répondu Vitaliy Markitanov 2016-12-02 15:40:22

afin de poster vous devez soumettre les données du formulaire. Je ne pense pas qu'il soit possible de le faire avec un ActionLink. Vérifier ce lien .

0
répondu dnoxs 2010-01-12 12:18:45

je recommande de rester pur pour se reposer des principes et d'utiliser un HTTP Supprimer pour vos suppressions. Malheureusement, HTML Specs n'a que HTTP Get & Post. Une balise ne peut recevoir QU'un HTTP. Une balise form peut soit faire un GET HTTP ou un Post. Heureusement, si vous utilisez ajax, vous pouvez faire une suppression HTTP et c'est ce que je recommande. Voir le billet suivant pour plus de détails: Http Deletes

0
répondu coding4fun 2011-07-31 05:34:02

j'ai fait la même chose en utilisant le code suivant:

@using (Html.BeginForm("Delete", "Admin"))
{
       @Html.Hidden("ProductID", item.ProductID)
       <input type="submit" value="Delete" />
}
0
répondu isxaker 2014-11-20 07:09:59

l'Appel de $.post () ne fonctionnera pas car il est basé sur Ajax. Une méthode hybride doit donc être utilisée à cette fin.

Voici la solution qui fonctionne pour moi.

Steps: 1. Créer une URL pour href qui appelle la méthode a avec url et paramètre 2. Appelez normal POST en utilisant la méthode JavaScript

Solution:

In .cshtml:

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

Note: la méthode anonyme devrait être enveloppée dans (....)() c'est à dire

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

postGo est défini comme suit en JavaScript. Le repos est simple..

@Url.Action("Affichage") crée l'url de l'appel

{ 'id': @réception.ReceiptId } crée des paramètres comme objet qui est à son tour converti en champs POST dans la méthode postGo. Ce peut être n'importe quel paramètre que vous require

En 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);

URLs de référence que j'ai utilisé pour postGo

Non-ajax GET / POST using jQuery (plugin?)

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

0
répondu Tejasvi Hegde 2017-05-23 12:10:30

jQuery.post() fonctionne si vous avez des données personnalisées. Si vous voulez poster le formulaire existant, il est plus facile à utiliser ajaxSubmit() .

et vous n'avez pas à configurer ce code dans le ActionLink lui-même, puisque vous pouvez attacher le gestionnaire de liens dans l'événement document.ready() (qui est une méthode préférée de toute façon), par exemple en utilisant $(function(){ ... }) jQuery truc.

0
répondu queen3 2016-12-02 12:48:43

est tombé sur ce besoin de poster d'une recherche (Index) page à la page de résultat. Je n'en avais pas besoin autant que @Vitaliy l'a déclaré, mais cela m'a indiqué la bonne direction. Tout ce que j'avais à faire était ceci:

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

mon contrôleur avait la méthode de signature suivante:

[HttpPost]
public async Task<ActionResult> Result(string k)
0
répondu Grandizer 2017-02-08 15:18:57