【问题标题】:MVC Html.ActionLink parameter values not being passed未传递 MVC Html.ActionLink 参数值
【发布时间】:2014-07-09 06:40:42
【问题描述】:

我正在测试 MVC 以进行演示,我设法将一些部分拼凑在一起,但现在我遇到了 Html.ActionLink 问题。目的是向用户显示一系列下拉列表,他们必须在显示 ActionLink 之前选择这些下拉列表。为此,我复制了一些 JQuery 来隐藏/显示我的下拉列表(在进行选择时)和 ActionLink。我向我的 JQuery 添加了一个警报来检查我的值,并且通过警报看起来一切都很好。但是,如果我调试控制器,则参数值默认为 0。我不确定要包含哪些代码,但我会尝试包含相关部分。我认为这是基本的东西。

这里是下拉列表和 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" }) 

这是用于隐藏/显示和填充级联下拉列表的复杂 JQuery。

<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>

我的控制器有这个和 id 并且羡慕最终是 0:

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

如果我需要包含其他内容,请告诉我。

这是填充作业下拉列表的方法。这没有问题。是对 Submit 的 Html.ActionLink 调用未能包含参数。

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);
}

【问题讨论】:

    标签: javascript jquery asp.net-mvc


    【解决方案1】:

    你的链接

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

    在您在下拉列表中进行任何选择之前在服务器端呈现。如果selected_job_IDselected_env_ID 的初始值为零或空,那么这些值将被传递给控制器​​(查看呈现的html)。

    如果您想传递下拉列表中选择的值,您可以修改下拉更改事件中的链接 href 属性,或者创建一个按钮而不是链接,并在基于按钮的单击事件中进行重定向在下拉值上。

    【讨论】:

    • 你是对的。我当时认为这就是问题所在,但我没有意识到这一点,因为我从各种来源提取代码来解决个别问题,而没有看大局。我能够让一个按钮和脚本工作,但现在我质疑我的代码现在的位置。级联的下拉列表可能让我走错了路。我可能会问另一个关于如何重做页面并避免使用 JQuery 的问题。
    【解决方案2】:

    你需要使用JSON.stringify():

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

    【讨论】:

    • 我忘记包含填充作业列表的控制器方法。如果没有 stringify(),它实际上可以正常工作。我试图在这里添加 SelectJobs(int id) 但我无法弄清楚格式。可以说它有效并填充了下拉列表。问题是 Html.ActionLink 试图在控制器中运行 Submit() 操作。很抱歉造成混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2012-10-25
    相关资源
    最近更新 更多