ASP.NET MVC ActionLink e método post

Alguém pode me dizer como posso enviar valores para o controlador usando ActionLink e método POST?
Eu não quero usar botões.
Eu acho que tem algo com jquery.

   

    Se você estiver usando o ASP MVC3, poderá usar um Ajax.ActionLink (), que permite especificar um método HTTP que você pode definir como “POST”.

    Você pode usar o jQuery para fazer um POST para todos os seus botões. Apenas dê a eles o mesmo nome de CssClass.

    Use “return false”; no final do seu evento onclick javascript, se você quiser fazer um RedirectToAction do lado do servidor após o post, caso contrário, basta retornar a exibição.

    Razor Code

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

    Código 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); } 

    A @Aidos teve a resposta certa, só queria deixar claro, uma vez que está escondida dentro de um comentário em seu post feito por @CodingWithSpike.

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

    O ActionLink nunca irá triggersr. Sempre aciona o pedido GET.

    Aqui foi uma resposta assada no projeto padrão da ASP.NET MVC 5, acredito que realiza meus objectives de estilo bem na interface do usuário. Formulário enviar usando JavaScript puro para algum formulário contendo.

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

    O caso de uso totalmente mostrado é uma lista suspensa de logout na barra de navegação de um aplicativo da web.

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

    Use o seguinte, chamar o link de ação:

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

    Para enviar os valores do formulário, use:

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

    Ele enviará os dados ao controlador do cliente e à ação CustomerSearchResults.

    Use este link dentro do Ajax.BeginForm

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

    😉

    Minha solução para esse problema é bem simples. Eu tenho uma página que faz um cliente pesquisar um por todo o email e outro por um parcial, o parcial puxa e exibe uma lista a lista tem um link de ação que aponta para um actionresult chamado GetByID e passa o id

    o GetByID puxa os dados para o cliente selecionado e retorna

     return View("Index", model); 

    qual é o método post

    Este tem sido um problema difícil para eu resolver. Como posso construir um link dynamic no razor e no html que pode chamar um método de ação e passar um valor ou valores para um método de ação específico? Eu considerei várias opções, incluindo um ajudante html personalizado. Acabei de chegar a uma solução simples e elegante.

    A vista

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

    O método de ação

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

    O ponto aqui é que o Url.Action não se importa se o método de ação é um GET ou um POST. Ele acessará qualquer tipo de método. Você pode passar seus dados para o método de ação usando

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

    o object routeValues. Eu tentei isso e funciona. Não, você não está tecnicamente fazendo um post ou enviando o formulário, mas se o object routeValues ​​contém seus dados, não importa se é um post ou um get. Você pode usar uma assinatura de método de ação específica para selecionar o método correto.

    Esta é a minha solução para o problema. Este é o controlador com 2 methods de ação

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

    Em Exibir, eu renderizo a seguinte estrutura de construção.

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

    Ponto de interesse em Razor View :

    1. Função JavaScript confirmDelete(id) que é chamada quando o link gerado com @Html.ActionLink é clicado;

    2. function confirmDelete() requerida id do item que está sendo clicado. Este item é passado do manipulador onClick confirmDelete("+feedback.Id+");return false; O manipulador de atenção de pagamento retorna false para evitar a ação padrão – que é o pedido get para segmentar. OnClick evento OnClick para botões pode ser anexado com jQuery para todos os botões na lista como alternativa (provavelmente será ainda melhor, pois haverá menos texto na página HTML e os dados poderão ser passados ​​por meio do atributo data- ).

    3. Formulário tem id=myForm , para encontrá-lo em confirmDelete() .

    4. Formulário inclui @Html.HttpMethodOverride(HttpVerbs.Delete) para usar o verbo HttpDelete , como ação marcada com o HttpDeleteAttribute .

    5. Na function JS eu uso confirmação de ação (com ajuda de plugin externo, mas a confirmação padrão funciona bem também. Não se esqueça de usar bind() em call back ou var that=this (o que você preferir).

    6. Formulário tem um elemento oculto com id='idField' e name='id' . Portanto, antes que o formulário seja enviado após a confirmação ( result==true ), o valor do elemento oculto é definido como valor passado no argumento e o navegador enviará os dados para o controlador da seguinte forma:

    URL de solicitação : http://localhost:38874/Feedback/Delete

    Método de Solicitação : Código de Status do POST: 302 Encontrado

    Cabeçalhos de Resposta

    Local: / Comentários Host: localhost: 38874 Dados do Formulário X-HTTP-Method-Override: DELETE id: 5

    Como você vê, é a solicitação POST com X-HTTP-Method-Override: DELETE e dados no corpo definido como “id: 5”. A resposta tem o código 302 que redireciona à ação do índice, por este você refresca sua canvas após a supressão.

    Para enviar o POST, você precisa enviar os dados do formulário. Eu não acho que é possível fazer isso com um ActionLink. Confira este link .

    Eu recomendaria ficar puro aos princípios REST e usando uma exclusão HTTP para suas exclusões. Infelizmente, as especificações HTML só têm HTTP Get & Post. Uma tag só pode receber um HTTP. Uma tag de formulário pode fazer um HTTP Get ou Post. Felizmente, se você usar ajax, você pode fazer uma exclusão HTTP e é isso que eu recomendo. Veja o seguinte post para detalhes: Exclui Http

    Eu fiz o mesmo problema usando o seguinte código:

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

    Chamar $ .post () não funcionará, pois é baseado em Ajax. Portanto, um método híbrido precisa ser usado para essa finalidade.

    A seguir, a solução que está funcionando para mim.

    Passos: 1. Crie um URL para href que chame o método a com url e o parâmetro 2. Chame o POST normal usando o método JavaScript

    Solução:

    Em .cshtml:

     View 

    Nota: o método anônimo deve ser envolto em (….) () ou seja

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

    postGo é definido como abaixo em JavaScript. rest são simples ..

    @ Url.Action (“View”) cria url para a chamada

    {‘id’: @ receipt.ReceiptId} cria parâmetros como object que é convertido em campos POST no método postGo. Isso pode ser qualquer parâmetro que você precisar

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

    URLs de referência que usei para postGo

    Não-ajax GET / POST usando jQuery (plugin?)

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

    jQuery.post() funcionará se você tiver dados personalizados. Se você quiser postar o formulário existente, é mais fácil usar ajaxSubmit() .

    E você não precisa configurar esse código no próprio ActionLink , já que você pode append o manipulador de link no evento document.ready() (que é um método preferido de qualquer maneira), por exemplo, usando $(function(){ ... }) truque jQuery.

    Veio através desta necessidade de POST de uma página de pesquisa (índice) para a página de resultados. Eu não precisava tanto quanto @Vitaliy afirmou, mas me apontou na direção certa. Tudo o que eu tinha que fazer era isso:

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

    }

    Meu controlador tinha o seguinte método de assinatura:

     [HttpPost] public async Task Result(string k)