Pregunta

¿Alguien puede decirme cómo puedo enviar valores al Controlador ActionLink y método POST?
No quiero usar los botones.
Supongo que tiene algo con jquery.

¿Fue útil?

Solución

No se puede utilizar un ActionLink debido a que solo rinde una etiqueta <a> ancla.
Puede utilizar un jQuery AJAX posterior .
O simplemente llamar de forma presentara método con o sin jQuery (que sería no AJAX), tal vez en el caso de que sea onclick de control que más le apetezca.

Otros consejos

Si está utilizando ASP MVC3 Se podría utilizar un Ajax.ActionLink (), que le permite especificar un método HTTP que se podría establecer a "POST".

Puede utilizar jQuery para hacer un post para todos los botones. Sólo les dan el mismo nombre CssClass.

Utilice "return false;" al final de su onclick javascript evento si usted quiere hacer un RedirectToAction lado del servidor después de que el mensaje de lo contrario sólo volver la vista.

Código de afeitar

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

@Aidos tenía la respuesta correcta sólo quería dejar claro ya que se oculta dentro de un comentario de su publicación hecha por @CodingWithSpike.

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

A continuación, fue una respuesta al horno en el valor por defecto del proyecto ASP.NET MVC 5 Creo que lleva a cabo mis objetivos de estilo muy bien en la interfaz de usuario. Envío de formulario usando javascript puro a una cierta forma que contiene.

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

El caso de uso totalmente que se muestra es una lista desplegable de cierre de sesión en la barra de navegación de una aplicación de 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 lo hará después del fuego. Siempre desencadenar petición GET.

Utilice la siguiente la llamada, el Enlace de acción:

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

Para la presentación de los valores de forma de uso:

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

Se presentará los datos con el controlador de cliente y Acción CustomerSearchResults.

Utilice este enlace dentro Ajax.BeginForm

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

;)

Mi solución a este problema es bastante simple. Tengo una página que hace una búsqueda del cliente, uno por todo el correo electrónico y el otro por unos parciales, los tirones parciales y muestra una lista de la lista tiene un enlace de acción que apunta a un ActionResult llamada GetByID y pasa en el id

el GetByID tira de los datos para el cliente seleccionado a continuación, devuelve

return View("Index", model); 

que es el método de post

Este ha sido un problema difícil para mí para resolver.¿Cómo puedo crear un vínculo dinámico en la navaja de afeitar y el código html que se puede llamar a un método de acción y pasar un valor o valores a un determinado método de acción?He considerado varias opciones, incluyendo un custom html helper.Me acaba de llegar con una solución sencilla y elegante.

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

El método de acción

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

El punto aquí es que la Url.La acción no importa si la acción es un método GET o POST.Tendrá acceso a cualquier tipo de método.Usted puede pasar sus datos a la acción utilizando el método

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

el routeValues objeto.He intentado esto y funciona.No, usted no está técnicamente hacer un post o enviar el formulario, pero si la routeValues objeto que contiene los datos, no importa si es un post o get.Usted puede utilizar un determinado método de acción de la firma para seleccionar el método adecuado.

He hecho el mismo problema utilizando el código siguiente:

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

Esta es mi solución para el problema.Este es el controlador con 2 métodos de acción

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 Vista me hacen a construir siguiente estructura.

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

Punto de interés de Vistas Razor:

  1. Función de JavaScript confirmDelete(id) la que se llama cuando el vínculo generado con @Html.ActionLink se hace clic;

  2. confirmDelete() la función de identificación del punto de que se hace clic.Este elemento se pasa de onClick controlador de confirmDelete("+feedback.Id+");return false; Preste atención controlador devuelve false para evitar la acción por defecto - que es la solicitud de destino. OnClick evento para los botones podrían ser conectados con jQuery para todos los botones en la lista como alternativa (probablemente va a ser aún mejor, ya que será menos texto en el código HTML de la página de datos y puede ser transmitida a través de data- atributo).

  3. Formulario id=myForm, con el fin de encontrar en confirmDelete().

  4. El formulario incluye @Html.HttpMethodOverride(HttpVerbs.Delete) con el fin de utilizar el HttpDelete verbo, como acción marcada con el HttpDeleteAttribute.

  5. En la función JS puedo hacer uso de la acción de la confirmación (con la ayuda de un plugin externo, pero el estándar de confirmar que funciona bien también.No olvides usar bind() en call back o var that=this (lo que usted prefiera).

  6. Formulario tiene un elemento oculto con id='idField' y name='id'.Así que antes de enviar el formulario después de la confirmación (result==true), el valor del elemento oculto es establecido a un valor argumento pasado y el navegador va a enviar los datos al controlador, como este:

La URL de la solicitud:http://localhost:38874/Feedback/Delete

Método De Solicitud:POST de Código de Estado:302 Found

Los Encabezados De Respuesta

Ubicación:/Comentarios Host:localhost:38874 Los Datos Del Formulario X-HTTP-Method-Override:DELETE id:5

Como se puede ver es petición POST con X-HTTP-Method-Override:ELIMINAR datos y en el cuerpo ajustado a "id:5".La respuesta tiene 302 código que redirigir a la acción Index, por este refrescar la pantalla después de eliminar.

Recomiendo que se alojen pura a principios REST y utilizando un HTTP borrar para sus eliminaciones. Desafortunadamente HTML Especificaciones solamente tiene HTTP GET y Post. Una etiqueta sólo puede un HTTP GET. Una etiqueta de formulario o bien puede hacer un HTTP GET o POST. Afortunadamente si utiliza ajax se puede hacer un HTTP Eliminar y esto es lo que recomiendo. Ver el siguiente post para más detalles: Http Elimina

Llamando $ .post () no funcionará, ya que se basa el Ajax. Por lo que un método híbrido tiene que ser utilizado para este propósito.

A continuación se presenta la solución que está trabajando para mí.

Pasos: 1. Crear URL de href que llama al método con el URL y el parámetro 2. Llame a la POST normal usando el método de JavaScript

Solución:

En .cshtml:

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

Nota: el método anónimo debe ser envuelto en (....) () es decir

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

postGo se define como a continuación en JavaScript. Resto son simples ..

@ Url.Action ( "Ver") url crea para la llamada

{ 'id': @ receipt.ReceiptId} crea parámetros como objeto que está en-a su vez convierte a POST campos en el método postGo. Esto puede ser cualquier parámetro como sea necesario

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 referencia que he utilizado para postGo

no ajax GET / POST usando jQuery (plug-in?)

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

jQuery.post() funcionará si tiene datos personalizados. Si desea publicar forma actual, es más fácil de usar ajaxSubmit() .

Y usted no tiene que configurar el código en el propio ActionLink, ya que se puede adjuntar manejador enlace en caso document.ready() (que es un método preferido de todos modos), por ejemplo, usando jQuery $(function(){ ... }) truco.

encontré con esta necesidad de publicar por medio de una página de búsqueda (Índice) para la página de resultados. No necesitaba tanto como declaró @Vitaliy pero me señaló en la dirección correcta. Todo lo que tenía que hacer era esto:

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

Mi controlador tenía el siguiente método de firma:

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

Esto se toma del proyecto de ejemplo 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top