Cómo publicar ASP.NET MVC formulario Ajax usando JavaScript en lugar de enviar botón


Tengo un formulario simple creado usando Ajax.BeginForm:

<% using (Ajax.BeginForm("Update", "Description", new { id = Model.Id },
     new AjaxOptions
     {
       UpdateTargetId = "DescriptionDiv",
       HttpMethod = "post"
     },new {id ='AjaxForm' })) {%>
Description:
<%= Html.TextBox("Description", Model.Description) %><br />
<input type="submit" value="save" />
<% }%>

El controlador está conectado y devuelve una vista parcial que actualiza el DescriptionDiv. Y todo funciona perfectamente.

Ahora me gustaría poder enviar este formulario sin tener el botón enviar (a través de un clic en un enlace o en una imagen o lo que sea). Desafortunadamente este pequeño fragmento de jQuery no hace el trabajo:

$('form#AjaxForm').submit();

Envía el formulario, pero hace (supongo que no es sorprendente) un post-back regular y no un Ajax uno.

En aras de la simplicidad, el jQuery anterior está conectado de la siguiente manera:

<a href="#" onclick="$('form#AjaxForm').submit(); return false;">submit</a>

El onubmit del formulario está usando el Sys.Mvc.AsyncForm.handleSubmit () pero el envío de jQuery parece estar pasando por alto esto.

PS. Estoy buscando una solución en este enfoque particular. Sé cómo lograr lo mismo usando un formulario normal y publicándolo usando AJAX + jQuery. Sin embargo, estoy interesado en esta solución en particular.

Author: mfloryan, 2009-08-20

8 answers

Voy a asumir que su falta de comillas alrededor del selector es solo un error de transcripción, pero debería comprobarlo de todos modos. Además, no veo dónde le estás dando al formulario una identificación. Normalmente lo hace con el parámetro htmlAttributes. No te veo usando la firma que lo tiene. Una vez más, sin embargo, si el formulario está enviando en absoluto, esto podría ser un error de transcripción.

Si el selector y el id no son el problema, sospecho que podría ser porque el clic handler se añade a través de marcado cuando se utiliza la extensión Ajax BeginForm. Puedes intentar usar $('formulario').disparador ('enviar') o en el peor de los casos, haga que el controlador de clics en el ancla cree un botón de envío oculto en el formulario y haga clic en él. O incluso crear su propia presentación ajax utilizando jQuery puro (que es probablemente lo que haría).

Por último, debe darse cuenta de que al reemplazar el botón enviar, va a romper totalmente esto para las personas que no tienen javascript habilitado. Manera alrededor de esto es también tener un botón oculto usando una etiqueta noscript y manejar ambos mensajes AJAX y no AJAX en el servidor.

POR cierto, es considerar la práctica estándar, Microsoft no obstante, para agregar los controladores a través de javascript no a través de marcado. Esto mantiene su javascript organizado en un solo lugar para que pueda ver más fácilmente lo que está sucediendo en el formulario. Aquí hay un ejemplo de cómo usaría el mecanismo de disparo.

  $(function() {
      $('form#ajaxForm').find('a.submit-link').click( function() {
           $('form#ajaxForm').trigger('submit');
      }).show();
  }

<% using (Ajax.BeginForm("Update", "Description", new { id = Model.Id },
     new AjaxOptions
     {
       UpdateTargetId = "DescriptionDiv",
       HttpMethod = "post"
     }, new { id = "ajaxForm" } )) {%>
   Description:
   <%= Html.TextBox("Description", Model.Description) %><br />
   <a href="#" class="submit-link" style="display: none;">Save</a>
   <noscript>
       <input type="submit" value="Save" />
   </noscript>
<% } %>
 37
Author: tvanfosson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-20 12:14:05

Un ejemplo simple, donde un cambio en una lista desplegable desencadena un formulario ajax-submit para recargar una cuadrícula de datos:

<div id="pnlSearch">

    <% using (Ajax.BeginForm("UserSearch", "Home", new AjaxOptions { UpdateTargetId = "pnlSearchResults" }, new { id="UserSearchForm" }))
    { %>

        UserType: <%: Html.DropDownList("FilterUserType", Model.UserTypes, "--", new { onchange = "$('#UserSearchForm').trigger('submit');" })%>

    <% } %>

</div>

El disparador('onubmit') es la clave: llama a la función onubmit que MVC ha injertado en el formulario.

NB. El controlador UserSearchResults devuelve una vista parcial que representa una tabla utilizando el Modelo suministrado

<div id="pnlSearchResults">
    <% Html.RenderPartial("UserSearchResults", Model); %>
</div>
 7
Author: James McCormack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-17 03:37:11

Desafortunadamente, la activación de los eventos onubmit o submit no funcionará en todos los navegadores.

  • Funciona en IE y Chrome: #('form#ajaxForm')trigger('onsubmit');
  • Funciona en Firefox y Safari: #('form#ajaxForm')trigger ('submit');

Además, si activa('submit') en Chrome o IE, hace que se publique toda la página en lugar de hacer un comportamiento AJAX.

Lo que funciona para todos los navegadores es eliminar el comportamiento del evento onubmit y simplemente llamar a submit () en la forma misma .

<script type="text/javascript">
$(function() {

    $('form#ajaxForm').submit(function(event) { 
        eval($(this).attr('onsubmit')); return false; 
        });

    $('form#ajaxForm').find('a.submit-link').click( function() { 
        $'form#ajaxForm').submit();
        });

  }
</script>
  <% using (Ajax.BeginForm("Update", "Description", new { id = Model.Id },
     new AjaxOptions
     {
       UpdateTargetId = "DescriptionDiv",
       HttpMethod = "post"
     }, new { id = "ajaxForm" } )) {%>
   Description:
   <%= Html.TextBox("Description", Model.Description) %><br />
   <a href="#" class="submit-link">Save</a> 
<% } %>

Además, el enlace no tiene que estar contenido dentro del formulario para que esto funcione.

 6
Author: Brian Reiter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-03 21:11:52

He intentado varias veces que el envío del formulario ajax funcione bien, pero siempre me encontré con un fracaso completo o demasiados compromisos. Este es un ejemplo de página que usa el complemento jQuery Form dentro de una página MVC para actualizar una lista de proyectos (usando un control parcialmente renderizado) como el usuario escribe en un cuadro de entrada:

<div class="searchBar">
    <form action="<%= Url.Action ("SearchByName") %>" method="get" class="searchSubmitForm">
        <label for="projectName">Search:</label>
        <%= Html.TextBox ("projectName") %>
        <input class="submit" type="submit" value="Search" />
    </form>
</div>
<div id="projectList">
    <% Html.RenderPartial ("ProjectList", Model); %>
</div>

<script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery("#projectName").keyup(function() {
            jQuery(".searchSubmitForm").submit();
        });

        jQuery(".searchSubmitForm").submit(function() {
            var options = {
                target : '#projectList'
            }

            jQuery(this).ajaxSubmit(options);

            return false;
        });

        // We remove the submit button here - good Javascript depreciation technique
        jQuery(".submit").remove();
    });
</script>

Y del lado del controlador:

public ActionResult SearchByName (string projectName)
{
    var service = Factory.GetService<IProjectService> ();
    var result = service.GetProjects (projectName);

    if (Request.IsAjaxRequest ())
        return PartialView ("ProjectList", result);
    else
    {
        TempData["Result"] = result;
        TempData["SearchCriteria"] = projectName;

        return RedirectToAction ("Index");
    }
}

public ActionResult Index ()
{
    IQueryable<Project> projects;
    if (TempData["Result"] != null)
        projects = (IQueryable<Project>)TempData["Result"];
    else
    {
        var service = Factory.GetService<IProjectService> ();
        projects = service.GetProjects ();
    }

    ViewData["projectName"] = TempData["SearchCriteria"];

    return View (projects);
}
 3
Author: Kieron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-20 12:48:50

Ajax.BeginForm parece ser un fracaso.

Usando un Html normal.Comience por, esto hace el truco muy bien:

$('#detailsform').submit(function(e) {
    e.preventDefault();
    $.post($(this).attr("action"), $(this).serialize(), function(r) {
        $("#edit").html(r);
    });
}); 
 2
Author: Levitikon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-16 15:55:21

Intente de la siguiente manera:

<input type="submit" value="Search" class="search-btn" />
<a href="javascript:;" onclick="$('.search-btn').click();">Go</a>
 2
Author: Dinesh Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-17 09:04:55

En lugar de usar JavaScript, tal vez intente algo como

<a href="#">

  <input type="submit" value="save" style="background: transparent none; border: 0px none; text-decoration: inherit; color: inherit; cursor: inherit" />

</a>
 0
Author: Benjamin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-14 21:44:04

Simplemente coloque el botón normal en Ajax.BeginForm y haga clic en buscar formulario padre y enviar normal. Formulario Ajax en Razor:

@using (Ajax.BeginForm("AjaxPost", "Home", ajaxOptions))
    {        
        <div class="form-group">
            <div class="col-md-12">

                <button class="btn btn-primary" role="button" type="button" onclick="submitParentForm($(this))">Submit parent from Jquery</button>
            </div>
        </div>
    }

Y Javascript:

function submitParentForm(sender) {
    var $formToSubmit = $(sender).closest('form');

    $formToSubmit.submit();
}
 0
Author: Rostislav Štryncl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-09 14:38:20