Comment soumettre une liste déroulante dans asp.net mvc d'un formulaire Ajax

Comment soumettre à partir d'un événement dropdownlist "onchange" à partir d'un formulaire ajax?

selon la question suivante: Comment soumettre une liste déroulante dans asp.net mvc , de l'intérieur D'un Html.Begin from you peut définir onchange= " this.forme.soumettre" et de changer les postes de dépose retour.

Cependant, en utilisant le code suivant (à l'intérieur D'un Ajax.Begin from):

<% using (Ajax.BeginForm("UpdateForm", new AjaxOptions() { UpdateTargetId = "updateText" })) { %>
    <h2>Top Authors</h2>

    Sort by:&nbsp;<%=Html.DropDownList("sortByList", new SelectList(ViewData["SortOptions"], new { onchange = "this.form.submit()" })%>

    <%= Html.TextBox("updateText")%>
<% } %>

action du contrôleur, mais la page entière est remplacée par le contenu du texte "updateText", plutôt que simplement ce qui se trouve à l'intérieur de la zone de texte "updateText".

donc, plutôt que de remplacer seulement la zone à l'intérieur de L'Ajax.BeginForm, la page entière est remplacée.

Quelle est la bonne façon pour la dropdownlist de l'appeler.forme.soumettre telles que seule la zone à l'intérieur de l'Ajax.BeginForm?

21
demandé sur Community 2008-12-15 05:29:29

7 réponses

OK, presque 2 ans plus tard, tu t'en fous probablement plus. Qui sait: Peut-être que d'autres (comme moi; -).

voici donc la solution (extrêmement simple):

dans votre Html.DropDownList(...) appel, changement

new { onchange = "this.form.submit()" }

à

new { onchange = "this.form.onsubmit()" }

pouvez-vous faire la différence? ;- )

la raison est que Ajax.BeginForm() crée un formulaire avec un gestionnaire onsubmit() pour soumettre le formulaire asynchrone. En appelant submit() , vous contournez ce onsubmit() gestionnaire personnalisé. Appeler onsubmit() a fonctionné pour moi.

39
répondu Serge Wautier 2010-12-01 15:50:20

dans votre liste remplacer

this.form.submit()

à

$(this.form).submit();
5
répondu Bonomi 2014-06-25 14:48:43

Ce que vous pouvez essayer de le faire de cette (jQuery):

$("#yourDropdown").change(function() {
  var f = $("#yourForm");
  var action = f.attr("action");
  var serializedForm = f.serialize();
  $.post(action, serializedForm,
    function () { alert("Finished! Can do something here!") });
});
3
répondu Strelok 2008-12-15 03:30:17

j'ai eu le même problème aussi. J'ai eu plusieurs listes déroulantes dans des vues partielles afin qu'elles puissent se rafraîchir indépendamment, mais le fait de définir l'attribut "onchange" a continué à rafraîchir la page entière.

j'ai remarqué que "cette.forme.submit () " renvoie toujours au formulaire principal, en dehors de la vue partielle. Donc à la place j'ai ajouté un bouton Soumettre à L'intérieur du formulaire AJAX et fait référence à cela:

<%=Html.DropDownList("data", ViewData["data"] as SelectList
, new { onchange = "$(\"#button" + Model.IdIndex + "\").click();" })%>


<input type="submit" id="button<%=Model.IdIndex %>" style="display: none"  /><br />

Mon" Modèle.IdIdex" est juste une variable pour accéder à différents les contrôles dans la même page. Espérons que cela aide.

2
répondu Francisco 2009-06-09 16:55:59

si vous utilisez MVC alors probablement la meilleure façon est avec jQuery...

<%= Html.DropDownList("sortByList", new SelectList(ViewData["SortOptions"]) %> 
<%= Html.TextBox("updateText") %>

<script>
$("#sortByList").change(function() {
    $.ajax({
        url: <%= Url.Action("UpdateForm")%>,
        type: "POST",
        data: { 'sortBy': $(this).val() },
        dataType: "json",
        success: function(result) { $('#updateText').text(result); },
        error: function(error) { alert(error); }
    })

});
</script>

Votre contrôleur serait quelque chose comme:

public JsonResult UpdateForm(string sortBy)
{
    string result = "Your result here";
    return Json(result);
}
1
répondu Stephen Lloyd 2009-12-16 12:24:01

j'avais un bouton comme ça dans mon AJAX.BeginForm

  <button id="submitButton" type="submit"  class="btn" style="vertical-align: top"><i class="icon"></i> replace</button>

Et onsubmit ou la solution de Francisco n'a pas fonctionné (je ne sais toujours pas pourquoi)

donc j'ai créé une alternative:

  new { onchange = "document.getElementById('submitButton').click()" }
1
répondu Carbosound1 2012-05-18 03:02:35

peut-on voir votre code de contrôleur? Vous pouvez utiliser la Demande.IsMvcAjaxRequest () dans votre controller pour retourner seulement une partie des données si c'est une requête Ajax au lieu d'une vue entière. Dans votre vue, déplacez votre formulaire vers une vue partielle et appelez



Html.RenderPartial("viewname");

dans votre contrôleur:

if (Request.IsMvcAjaxRequest())

{

return PartialView("viewname");

}

else

{ //Non Ajax code here. }

0
répondu Adam 2008-12-21 03:00:58