Question

Quelqu'un peut me dire comment puis-je soumettre les valeurs de Contrôleur à l'aide d'ActionLink et méthode POST?
Je ne veux pas utiliser les boutons.
Je suppose que cela a quelque chose avec jquery.

Était-ce utile?

La solution

Vous ne pouvez pas utiliser un ActionLink parce que juste une étiquette rend de <a> d'ancrage.
Vous pouvez utiliser un jQuery AJAX après .
Ou tout simplement appeler présenter sous la forme de méthode avec ou sans jQuery (ce qui serait non-AJAX), peut-être en cas de onclick de tout contrôle prend votre fantaisie.

Autres conseils

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

Vous pouvez utiliser jQuery pour faire un post pour tous vos boutons. Il suffit de leur donner le même nom CssClass.

Utilisez "return false;" à la fin de votre événement onclick javascript si vous voulez faire un côté serveur RedirectToAction après que le message autrement juste retour la vue.

Code de Razor

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

Code de 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 avait la bonne réponse voulait juste qu'il soit clair car il est caché dans un commentaire sur son poste faite par @CodingWithSpike.

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

Il y avait là une réponse au four dans le défaut ASP.NET MVC 5 projet, je crois que mes objectifs accomplit style bien dans l'interface utilisateur. Envoi de formulaire 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 entièrement affiché est une liste déroulante 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>
}

ActionLink ne sera jamais après l'incendie. Il déclenche toujours GET demande.

Utilisez ce qui suit l'appel de l'action Lien:

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

Pour la présentation 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.

Utilisez ce lien à l'intérieur Ajax.BeginForm

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

;)

Ma solution à ce problème est assez simple. J'ai une page qui fait une recherche client un par l'ensemble e-mail et l'autre par une partielle, les tractions partielles et affiche une liste de la liste a un lien d'action qui pointe vers un ActionResult appelé GetByID et passe dans l'id

la GetByID tire les données du client sélectionné retourne alors

return View("Index", model); 

qui est la méthode post

Cela a été un problème difficile pour moi de résoudre.Comment puis-je créer un lien dynamique en lame de rasoir et le html que l'on peut appeler une méthode d'action et de passer une ou des valeurs à une action spécifique de la méthode?J'ai envisagé plusieurs options, y compris une assistance html personnalisée.Je suis juste venu avec 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>
}

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 que l'Url.L'Action ne se soucie pas de savoir si l'action est une méthode GET ou POST.Elle aura accès à un autre type de méthode.Vous pouvez transmettre vos données à la méthode d'action à l'aide de

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

le routeValues objet.J'ai essayé et ça marche.Non, vous n'êtes pas techniquement faire un post ou la soumission du formulaire, mais si le routeValues objet contient vos données, il n'importe pas si c'est un post ou un get.Vous pouvez utiliser un particulier de la méthode d'action de la signature de choisir la bonne méthode.

Je l'ai fait la même question en utilisant le code suivant:

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

Ceci est ma solution pour le problème. Ceci 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");
}
}

Dans la vue je rends 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>

Le point d'intérêt Voir Razor :

  1. confirmDelete(id) fonction JavaScript qui est appelée lorsque l'utilisateur clique sur le lien généré avec @Html.ActionLink;

  2. fonction confirmDelete() id requis de l'article étant cliqué. Cet article est passé de gestionnaire onClick confirmDelete("+feedback.Id+");return false; gestionnaire Faites attention retourne false pour empêcher l'action par défaut - ce qui est d'obtenir la demande de cibler. événement OnClick pour les boutons pourrait être attaché avec jQuery pour tous les boutons dans la liste comme une alternative (probablement il sera encore mieux, car il sera moins de texte dans la page HTML et des données pourrait être passé par attribut data-).

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

  4. Formulaire comprend @Html.HttpMethodOverride(HttpVerbs.Delete) afin d'utiliser le verbe HttpDelete, comme une action marquée par la HttpDeleteAttribute.

  5. Dans la fonction JS J'utilise la confirmation d'action (avec l'aide du plug-in externe, mais confirmer la norme fonctionne bien aussi. Ne pas oublier d'utiliser bind() en rappel ou var that=this (tout ce que vous préférez).

  6. forme a un élément caché avec id='idField' et name='id'. Donc, avant l'envoi du formulaire après confirmation (result==true), la valeur de l'élément caché est défini sur la valeur et l'argument passé navigateur soumettront des données au contrôleur comme ceci:

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

Demande Méthode : POST Code d'état: 302 Trouvé

têtes de réponse

Localisation: / Commentaires Hôte: localhost: 38874 Formulaire de données X-HTTP-Méthode-Prioritaire: SUPPRIMER id: 5

Comme vous le voyez, il est POST demande avec X-HTTP-Méthode-Prioritaire: SUPPRIMER et les données dans le corps réglé sur « id: 5 ». Réponse a 302 du code qui redirigent l'action Index, par ce que vous actualisez votre écran après suppression.

Je recommande de rester pur aux principes REST et en utilisant un HTTP supprimer pour vos suppressions. Malheureusement HTML Compatibles Caractéristiques que HTTP Get et Post. Une étiquette ne peut un HTTP Get. Une balise de formulaire peut soit faire un HTTP Get ou Post. Heureusement, si vous utilisez ajax vous pouvez faire un HTTP Supprimer et ce que je recommande. Voir le post suivant pour plus de détails: Http Supprime

L'appel de .post $ () ne fonctionne pas comme il est basé Ajax. Ainsi, une méthode hybride doit être utilisé à cet effet.

Ce qui suit est la solution qui travaille pour moi.

Étapes: 1. Créez URL href qui appelle la méthode avec l'URL et le paramètre 2. Appelez le POST en utilisant la méthode JavaScript

Solution:

En .cshtml:

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

Remarque: la méthode anonyme doit être enveloppé dans (....) () à savoir

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

postGo est défini comme ci-dessous en JavaScript. Rest sont simples ..

@ Url.Action ( "View") crée URL pour l'appel

{ 'id': @ receipt.ReceiptId} crée des paramètres comme objet qui est converti en tour POST champs dans la méthode postGo. Cela peut être un paramètre que vous avez besoin

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

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

non ajax GET / POST en utilisant jQuery (plugin?)

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

jQuery.post() fonctionnera si vous avez des données personnalisées. Si vous souhaitez publier forme actuelle, il est plus facile à utiliser ajaxSubmit() .

Et vous ne devez pas configurer ce code dans le ActionLink lui-même, puisque vous pouvez joindre gestionnaire de lien en cas de document.ready() (qui est une méthode préférée de toute façon), par exemple en utilisant $(function(){ ... }) trick jQuery.

suis tombé sur ce besoin de POST d'une page de recherche (index) à la page de résultats. Je ne l'ai pas besoin autant que @Vitaliy dit, mais il m'a orienté dans la bonne direction. Tout ce que je devais faire était le suivant:

@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 a la méthode de signature suivante:

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

Ceci est pris de l'exemple de projet 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>
            }
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top