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.
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.
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. 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);
}
@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" })
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>
}
ActionLink ne tirera jamais. Ça déclenche toujours une requête.
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.
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;" })
;)
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
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.
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 :
-
fonction JavaScript
confirmDelete(id)
qui s'appelle lorsque le lien généré par@Html.ActionLink
est cliqué; - La fonction
confirmDelete()
exigeait l'identification de l'élément cliqué. Ce poste est passé deonClick
gestionnaireconfirmDelete("+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 viadata-
attribut). -
forme a
id=myForm
, afin de le trouver dansconfirmDelete()
. -
inclut
@Html.HttpMethodOverride(HttpVerbs.Delete)
afin d'utiliser le verbeHttpDelete
comme action marquée avec leHttpDeleteAttribute
. -
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 ouvar that=this
(tout ce que vous préférez). -
forme a un élément caché avec
id='idField'
etname='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.
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
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" />
}
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
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.
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)