简体   繁体   中英

Change view using ajax on drop-down list change event

I need to change the view in same page using ajax when the user changes the option of the drop-down list.

Up until now in my view I have the drop down list

    <div class="wrapper">
        <div>
            <label>Get cars per people </label>
            @Html.DropDownList("ddlChange", new SelectList(ViewBag.OptionsList,"Value","Text", ViewBag.selectedValue),new { @id = "ddlChangeID" })
        </div>
        <div class="box box-success">
            <div class="box-body">
                <div>
                    <canvas id="myChart"></canvas>
                </div>
            </div>
        </div>
    </div>

Then in a script (which I found from another question)

$(document).ready(function () {
    $("#ddlChangeID").change(function () {
        var strSelected = "";
        $("#ddlChangeID:selected").each(function () {
            strSelected += $(this)[0].value;
        });
        var url = "/Cars/Index/" + strSelected;
        $.post(url, function (data) {
        });
    });
})

And in the controller I am using ViewBag values to save the drop-down list values and whatever else is needed for the graph which loads in a different script again with ViewBag values. I have managed to pass the selected value (strSelected) but the view does not reload with the new data.

How should I make the ajax event?

Change your script ajax call by calling an action result as follows

$("#ddlChangeID").change(function () {
  $.ajax({
    url: "/Controller/ActionHtml?id="+$('#ddlChange').val(),
  type: "POST",
  cache: false,
  success: function (result) {
     $("#myChart").html(result);
    },
    error: function () {
       $("#myChart").empty();
    }
 });
});

and in the controller the actionresult will be like the following which returns the html partial view that you need to append

 public ActionResult ActionHtml(string id)
    {
       //Here you can load the data based on the id,pass model to the patial views etc
        ViewBag.id = id;
        return PartialView("~/Views/Shared/myhtml.cshtml");
    }

myhtml.cshtml will be a partial view with the html content as //content is dummy,change the content as you want

<!DOCTYPE html>
<html>
<body>
<p>Enter some text in the fields below, then press the "Reset form" button to reset the form.</p>
<form id="myForm">
    First name: <input type="text" name="fname"><br>
    Last name: <input type="text" name="lname"><br><br>
</form>

So I changed the

     @Html.DropDownList("ddlChange", new SelectList(ViewBag.OptionsList,"Value","Text", ViewBag.selectedValue),new { @id = "ddlChangeID" })

To

     @Html.DropDownList("ddlChange", new SelectList(ViewBag.OptionsList,"Value","Text", ViewBag.selectedValue),new { @onchange = "ChangeOption()" })

adding also an id to the main div. And the script to

function ChangeOption() {
    var id = $('#ddlChange').val();
    $.ajax({
        url: '/Cars/Index',
        type: "GET",
        data: { Id: id },
        success: function (data) {
            $('#wrapAll').html(data);
        }
    });
}

It seems to work. Only issue now is that the css breaks. It pushes the graph and drop-down list to the right breaking the functionality.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM