Pregunta

He revisado varias publicaciones aquí para encontrar una solución.Intentaré una nueva pregunta.

mi formulario:

<form method="post" action="@Url.Action("Manage")"  data-cs-ajax="true" data-cs-target="#catalogList" >

Tiene un campo de autocompletar y paginación, muy similar al ejemplo de OdeToFood de Scott Allen.

Hay :

<input type="submit" value="Update" class="btn btn-default" />

que actualiza algunos elementos filtrados para seleccionarlos (todo funciona muy bien) y también:

<input type="submit" name="btnSave" id="btnSave" value="Save" class="btn btn-default" />

Ambos acertaron con éxito:

//POST: /WebCatalog/Manage/5
[HttpPost, ActionName("Manage")]
[ValidateAntiForgeryToken]
public ActionResult Manage([Bind(Include = "Id,CatalogId,CatalogColourId,CatalogSizeId,CatalogCategoryId,CatelogSupplierId,StartDate,EndDate,Active,isSubmitted")] WebCatalogViewModel model, string searchTerm = null, int page = 1)
    { ...

Llegan a la acción del controlador debido a javascript:

$(function () {

var ajaxFormSubmit = function () {
    var $form = $(this);

    var options = {
        url: $form.attr("action"),
        type: $form.attr("method"),
        data: $form.serialize()
    };

    $.ajax(options).done(function (data) {
        var $target = $($form.attr("data-cs-target"));
        var $newHtml = $(data);
        $target.replaceWith($newHtml);
        var options = {};
        $newHtml.effect("highlight", options, 500, doneEffect);
    });

    return false;
};

Ahora...

Quiero configurar un campo en el modelo para que el controlador sepa que se hizo clic en el segundo botón btnSave... para guardar el registro, por supuesto...

Entonces...

$(function () {

    $("#btnSave").click(function () {

        $("isSubmitted").val("1");
        return true;
    });

});

Y eso dispara:antes de que la página se envíe a través de ajax en ajaxFormSubmit, el código jQuery del botón para $(#btnSave") se activa correctamente.

Sin embargo, en la acción del controlador, isSubmitted siempre es 0.

He intentado :

$("isSubmitted").val(1);

Probé el formulario como método='get' y aún no he publicado nada, aunque podría intentar cambiar el método con javascript en la función btnSave.click js; no estoy seguro de cómo hacerlo... si puedo. Si no guardo un valor en un control de formulario, entonces ¿por qué podría cambiar el método del formulario?

Probé $Ajax.ActionLink, pero siempre aparece un error 500 IIS.

Básicamente, necesito una forma de saber que el usuario hizo clic en el botón Guardar, en lugar del botón Actualizar.

¡Se agradece cualquier consejo!

¿Fue útil?

Solución

@Robert Achmann, aquí está mi respuesta

Parece que falta el selector en $ ("issuMitted"), por ejemplo, por ejemplo.$ ("# issuMitted") para una entrada con una ID IssuMited.

Otros consejos

No necesita un valor oculto para indicarle al controlador en qué botón se hizo clic.Lo que debes hacer es nombrar los 2 botones de la siguiente manera

<input type="submit" name="btnAction" value="Update" class="btn btn-default" />
<input type="submit" name="btnAction" value="Save" id="btnSave" class="btn btn-default" />

Como puede ver, tienen el mismo nombre pero valores diferentes (actualizar frente a guardar).

En el controlador, agregue otro parámetro llamado btnAction, que es el nombre de los botones, a la acción.

[HttpPost, ActionName("Manage")]
[ValidateAntiForgeryToken]
public ActionResult Manage(string btnAction, [Bind(Include = "Id,CatalogId,CatalogColourId,CatalogSizeId,CatalogCategoryId,CatelogSupplierId,StartDate,EndDate,Active,isSubmitted")] WebCatalogViewModel model, string searchTerm = null, int page = 1)
{
     if(btnAction.ToLower() == "save")
     {
          // The save button was clicked
     }
     else if(btnAction.ToLower() == "update")
     {
          // The update button was clicked
     }
     else
     {
          // default ...
     }
}

Básicamente, el parámetro btnAction Obtendrá el valor del botón de enviar que activa el formulario para publicar.

Espero que esto ayude.

Puede un campo oculto en su formulario para almacenar el valor de qué campo se hizo clic (controlar esto con los manejadores de eventos de jQuery), y para esto podría hacer que su botón escriba="botón" en lugar de TIPO="ENVÍE" (Para enviar su formulario desde su código de jQuery) o podría usar EventPreventDefault.

Bueno, aquí hay una muestra de código que podría ayudarlo:

    <!DOCTYPE html>
    <html>
    <head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js">
    </script>
    <script>
    $(document).ready(function(){
      $("#bt1").click(function(){
        alert(' Save button');
        $("#operation").val('save');
        $("#frm").submit();
      });

      $("#bt2").click(function(){
        alert(' Update button');
        $("#operation").val('update');
        $("#frm").submit();
      });
    });
    </script>
    </head>

    <body>
       <form id="frm">
        <div id="div1"><h2> Form buttons - What of then was clicked? </h2></div>
        <button id="bt1"> Save button </button>
        <button id="bt2"> Update button </button>
         <input type="hidden" id="operation" name="operation" value=""/>
        </form>     
        </body>
        </html>

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top