Pergunta

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

Foi útil?

Solução

Você não pode usar um ActionLink Porque isso apenas torna uma âncora <a> marcação.
Você pode usar um JQuery Ajax Post.
Ou basta chamar o método de envio do formulário com ou sem jQuery (que seria não ajax), talvez no onclick Evento de qualquer controle que você sofre de sua fantasia.

Outras dicas

Se você estiver usando o ASP MVC3, você pode usar um ajax.actionlink (), que permite especificar um método HTTP que você possa definir como "postar".

Você pode usar o jQuery para fazer uma postagem para todos os seus botões. Basta dar a eles o mesmo nome CSSCLASS.

Use "Return false;" No final do seu evento OnClick JavaScript, se você quiser fazer um RedirectToAction do lado do servidor após a postagem, caso contrário, retorne a visualização.

Código de barbear

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

O @aidos teve a resposta certa só queria deixar claro, pois está escondido dentro de um comentário em seu post feito por @codingwithspike.

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

Aqui estava uma resposta assada no projeto padrão do ASP.NET MVC 5, acredito que atinge meus objetivos de estilo bem na interface do usuário. Formulário Envie usando JavaScript puro para algum formulário contendo.

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

O caso de uso totalmente mostrado é um suspensão 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()

    <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 nunca disparará post. Sempre aciona solicitação de obter.

Use o seguinte a chamada O link de ação:

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

Para enviar os valores do formulário, use:

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

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

Use este link dentro de 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 é bastante simples. Eu tenho uma página que faz uma pesquisa de cliente, uma por todo o e -mail e a outra por um parcial, os puxados parciais e exibem uma lista que a lista tem um link de ação que aponta para um ActionResult chamado getById e passa no id

O getById puxa os dados para o cliente selecionado e depois retorna

return View("Index", model); 

qual é o método de postagem

Este tem sido um problema difícil de resolver.Como posso construir um link dinâmico em razor e html que possa chamar um método de ação e passar um valor ou valores para um método de ação específico?Considerei várias opções, incluindo um auxiliar HTML personalizado.Acabei de encontrar uma solução simples e elegante.

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

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

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

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

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

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

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

Esta é a minha solução para o problema.Este é um controlador com 2 métodos 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 View eu renderizo a construção seguindo a estrutura.

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

Ponto de interesse no Razor View:

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

  2. confirmDelete() a função exigia o ID do item que está sendo clicado.Este item é passado de onClick manipulador confirmDelete("+feedback.Id+");return false; Preste atenção ao manipulador retornar falso para evitar a ação padrão - que é obter solicitação para o destino. OnClick O evento para botões poderia ser anexado com jQuery para todos os botões da lista como alternativa (provavelmente será ainda melhor, pois haverá menos texto na página HTML e os dados poderão ser passados ​​via data- atributo).

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

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

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

  6. O formulário possui 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 o valor do argumento passado e o navegador enviará os dados ao controlador assim:

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

Método de solicitação:Código de status POST:302 encontrado

Cabeçalhos de resposta

Localização:/Feedback Host: Localhost: 38874Dados do formulário Substituição do método X-HTTP:DELETE id:5

Como você pode ver, é uma solicitação POST com X-HTTP-Method-Override:DELETE e dados no corpo definidos como "id:5".A resposta possui código 302 que redireciona para a ação Index, com isso você atualiza sua tela após a exclusão.

Eu recomendaria permanecer nos princípios Pure to Rest e usar uma exclusão HTTP para suas exclusão. Infelizmente, as especificações HTML só têm http get & post. Uma tag apenas pode um http obter. Uma tag de formulário pode fazer um http obter ou postar. Felizmente, se você usar o AJAX, pode fazer uma exclusão http e é isso que eu recomendo. Veja o seguinte post para obter detalhes: HTTP exclui

Chamar $.post() não funcionará porque é baseado em Ajax.Portanto, um método híbrido precisa ser usado para esse propósito.

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

Passos:1.Crie URL para o HREF, que chama o método A com URL e o parâmetro 2.Chame POST normal usando o método JavaScript

Solução:

Em .cshtml:

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

Observação:O método anônimo deve ser envolvido em (....) () ou seja,

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

postarGo é definido como abaixo em JavaScript.O resto é simples..

@Url.Action("Visualizar") cria url para a chamada

{ 'eu ia':@receipt.ReceiptId } cria parâmetros como objeto que, por sua vez, é convertido em campos POST no método postGo.Este 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 = $("<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 referência que usei para postGo

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

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

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

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

Encontrou essa necessidade de postar em uma página de pesquisa (índice) na página de resultado. Eu não precisava tanto quanto o @vitaliy afirmou, mas isso me apontou na direção certa. Tudo que eu tinha que fazer era o seguinte:

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

Meu controlador tinha o seguinte método de assinatura:

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

Isso é retirado do projeto de amostra do 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>
            }
        }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top