简体   繁体   中英

MVC Html.ActionLink parameter values not being passed

I'm testing MVC for a demo and I managed to scrap together some pieces but now I am having trouble with an Html.ActionLink. The intent is to present the user with a series of dropdownlists that they must select before the ActionLink is shown. To do that I've copied some JQuery to hide/show my dropdownlists (as selections are made) and the ActionLink. I added an alert to my JQuery to check my values and via the alert it all looks good. But if I debug the controller the parm values are defaulted to 0. I'm not sure what code to include but I will try to include the relevant parts. I think it's something basic.

Here are the dropdown lists and ActionLink.

@Html.DropDownListFor(m => m.selected_env_ID, new SelectList(Model.Environments, "env_ID", "env_DESC"), "*Select an environment")
@Html.DropDownListFor(m => m.selected_app_ID, new SelectList(Model.Applications, "app_ID", "app_DESC"), "*Select an application",new { @hidden = "hidden" })
@Html.DropDownListFor(m => m.selected_job_ID, Enumerable.Empty<SelectListItem>(), "*Select a job", new { @hidden = "hidden" })
@Html.ActionLink("Submit", "Submit", new { id =  Model.selected_job_ID, envid = Model.selected_env_ID }, new {id = "lnkSubmit" }) 

Here is the convoluted JQuery to hide/show and fill the cascading dropdowns.

<script>
    $(document).ready(function ()
    {
        //Dropdownlist Selectedchange event 
        $("#selected_app_ID").change(function () {
            var id = $('#selected_app_ID').val(); // id value
            if (id == 0) {
                $('#selected_job_ID').hide();
            } else {
                $('#selected_job_ID').show();
                $("#selected_job_ID").empty();
                $.ajax({
                    type: 'POST',
                    url: '@Url.Action("SelectJobs")',
                    dataType: 'json',
                    data: { id: $("#selected_app_ID").val() },
                    success: function (jobs) {
                        // jobs contains the JSON formatted list of jobs passed from the controller 
                        $("#selected_job_ID").append('<option value=0>*Select a job</option>');
                        $.each(jobs, function (i, job) {
                            $("#selected_job_ID").append('<option value="'
                                + job.job_ID + '">'
                                + job.job_DESC + '</option>');
                        });
                    },
                    error: function (ex) {
                        alert('Failed to retrieve jobs.' + ex);
                    }
                });
            }
            return false;
        });

        //ddl select change
        $("#selected_env_ID").change(function () {
            var name = $('#selected_env_ID option:selected').text(); //Item1
            var id = $('#selected_env_ID').val(); // id value
            if (id == 0) {
                $('#divSubmit').hide();
                $('#selected_app_ID').hide();
                $('#selected_job_ID').hide();
            } else {
                $('#selected_app_ID').show();
            }
        });

        //ddl select change
        $("#selected_job_ID").change(function () {
            var name = $('#selected_job_ID option:selected').text(); //Item1
            var id = $('#selected_job_ID').val(); // id value
            var envid = $('#selected_env_ID').val(); // id value
            if (id == 0) {
                $('#divSubmit').hide();
            } else {
                $('#divSubmit').show();
                alert("envid=" + envid + " jobid=" + id);
            }
        });


    }); // end document ready

</script>

My controller has this and id and envid end up being 0:

public ActionResult Submit(int id = 0,int envid = 0) {

If I need to include something else just let me know.

Here is the method that fills the job dropdown list. This works without issues. It's the Html.ActionLink call to Submit that fails to include the parameters.

public JsonResult SelectJobs(int id)
{
    db.Configuration.ProxyCreationEnabled = false;
    IEnumerable<t_job> jobs = db.t_job.Where(j => j.app_ID == id).ToList();
    return Json(jobs);
}

您需要使用JSON.stringify()

data: JSON.stringify({ id: $("#selected_app_ID").val() }),

Your link

@Html.ActionLink("Submit", "Submit", new { id =  Model.selected_job_ID, envid = Model.selected_env_ID }, new {id = "lnkSubmit" })

is rendered on the server side before you make any selection in the dropdowns. If the initial values of selected_job_ID and selected_env_ID are zero or null, then those values will be passed to the controller (have a look at the rendered html).

If you want to pass the values selected in you drop downs, you could either modify the links href attribute in the drop down change events, or create a button instead of a link, and do a redirect in the buttons click event based on the dropdown values.

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