How do you submit from a dropdownlist \"onchange\" event from inside of an ajax form?
According to the following question: How do you submit a dropdownlist in asp.ne
Can we see your Controller code? You can use Request.IsMvcAjaxRequest() in your controller to return only a portion of data if it is an Ajax Request instead of an entire View. In your View move your form to a PartialView and call
Html.RenderPartial("viewname");
In your Controller:
if (Request.IsMvcAjaxRequest())
{
return PartialView("viewname");
}
else
{
//Non Ajax code here.
}
OK, nearly 2 years later, you probably don't care anymore. Who knows: Maybe others (such as me ;-) do.
So here's the (extremely simple) solution:
In your Html.DropDownList(...)
call, change
new { onchange = "this.form.submit()" }
to
new { onchange = "this.form.onsubmit()" }
Can you spot the difference? ;-)
The reason is that Ajax.BeginForm()
creates a form with an onsubmit()
handler to submit the form asynchronously. By calling submit()
, you bypass this onsubmit()
custom handler. Calling onsubmit()
worked for me.
If you are using MVC then probably the best way is with 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>
Your controller would be something like:
public JsonResult UpdateForm(string sortBy)
{
string result = "Your result here";
return Json(result);
}
in your dropdown replace
this.form.submit()
to
$(this.form).submit();
What you can try to do it this (jQuery required):
$("#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!") });
});
I had the same problem too. I had several dropdown lists in partial views so they could refresh independently, but setting the "onchange" attribute kept refreshing the entire page.
I noticed that "this.form.submit()" always referred to the main form, outside the partial view. So instead I added a submit button inside the AJAX form and referred to that:
<%=Html.DropDownList("data", ViewData["data"] as SelectList
, new { onchange = "$(\"#button" + Model.IdIndex + "\").click();" })%>
<input type="submit" id="button<%=Model.IdIndex %>" style="display: none" /><br />
My "Model.IdIdex" is just a variable to access different controls in the same page. Hope it helps.