下拉列表值的更改不会将更新的值返回给控制器

Posted

技术标签:

【中文标题】下拉列表值的更改不会将更新的值返回给控制器【英文标题】:Change in dropdownlist values does not return updated value to controller 【发布时间】:2020-04-26 16:15:45 【问题描述】:

我在将视图中的 DropDownList 中的更新值返回到控制器时遇到问题。 DropDownList 允许用户将值从“未计划”更改为“计划”

我正在返回一个带有名为status 的属性的订单列表(可以是“已安排的”或“未安排的”)。目前所有订单都返回“未预定”状态。

下面是 DropDownList 的代码:

将 DDL 值分别更改为 yes 和 no 后,代码仍然返回原始值

显示动作代码

  public ActionResult reviewOrderCSVPost()
    


        // display vieworder page with status (unscheduled)
        // return RedirectToAction("ViewOrders", new  status = "unscheduled" );


        var data = OrderProcessor.LoadOrder("unscheduled");

        List<Order> orders = new List<Order>();

        foreach (var row in data)
        
            orders.Add(new Order
            
                orderId = row.orderId,
                partId = row.partId,
                projectName = row.projectName,
                lastMaterialDate = row.lastMaterialDate,
                shipDate = row.shipDate,
                quantity = row.quantity,
                status = row.status,
                priority = row.priority
            );
        

        //   OrderDetail ObjorderDetail = new OrderDetail();
        //  ObjorderDetail.OrderDetails = orders;

        return View(orders);
    

Post 请求的操作代码(状态应根据用户选择的下拉列表而变化)

  public ActionResult reviewOrderCSVSchedule( int[] orderId, string[] status)
    

编辑

目前的计划是通过使用“DDL_”+@item.orderId 和名为“hidden_​​”@item.orderId 的唯一隐藏字段来拥有一个唯一的 ddl。我将在 DDL 上放置一个 on change 方法并触发一个 jquery 函数,该函数将更改隐藏字段值的值。希望有效

【问题讨论】:

欢迎来到 ***!我们喜欢问题中的代码,但代码是文本而不是图像;-) 使用控制台检查下拉列表的值是否在变化?另外,最好将item.status修改为modelItem.status 我今天过得很糟糕,我刚刚在其他方法中发现了类似的问题。 Post 请求动作在控制器中接受 int[] Id,但是它有同样的问题,不会根据用户的选择而改变!!例如列表包含 ID 1,2 用户将序列交换为 2,1。如果您想知道如何捕获 id 数组,则发布请求 int[] 仍然返回 1,2。我正在使用 【参考方案1】:

我猜你是在控制器操作方法中传递 Status[]。当您更改下拉列表时,您需要每次为已计划和未计划绑定状态中的最新值。这可能适用于您的情况。

【讨论】:

想详细说明一下?我该怎么做?【参考方案2】:

你可以看看这个

MVC Drop Down list with entity framework

使用modelItem.status 作为DropDownListFor 中的第一个参数

@html.DropDownListFor(modelItem => modelItem.status, new SelectList(Model.SiteNames, "Value", "Text"))

modelItem.status 也应该是 string 而不是 string[]

如果这没有帮助,请显示您的 Action 代码以及您发布此数据的方式,无论是使用 type = submit 还是 ajax post 提交表单。

编辑:好的,我想我现在看到了你的问题。

@item.status 在页面加载时具有“未调度”值,然后它将隐藏元素的值设置为“未调度”并且永远不会更改,因为 Razor 代码不会在客户端运行。您需要的是隐藏元素的唯一 ID、下拉列表中的伪类来识别它以及一些 jquery 来处理持久用户选择。

所以你的hidden 元素需要这样的东西:

<input type="hidden" name="status" id=@item.Id value=@item.status />

给你的DropDownList这样的东西:

@Html.DropDownListFor(x => item.status, new SelectList(listItems, "Value", "Text"), new  @id=item.Id, @class=item.Id )

您可以使用item.Id 以外的其他一些唯一属性,只需确保在 hidden 和 DropDownListFor 上使用相同的属性,因为这将使您的 jquery 更简单。

$(function () 
    $('select[name="status"]').on('click', function () 
        var hiddenId = $(this).attr('class');
        var persistValue = $(this).val();
        $('#' + hiddenId).val(persistValue);
    );
);

这将允许您向页面添加任意数量的Orders,并将每个隐藏的值正确绑定到为其各自的DropDownListFor 设置的值。您还应该能够使用jquery change 事件而不是click 事件。

希望这有助于解决这个问题。

【讨论】:

我很好地显示了下拉值。但是,我无法返回个人状态。当我更改下拉列表中的任何值时,它只会返回原始值 @TheBoredProgrammer 使用 modelItem.status 作为下拉列表中的第一个参数。我假设这是您正在检查更改的属性。 我在另一个答案中确切地提到了如何让整个事情正常工作。您可能只需要解决方案的 1 部分,但值得一读。 您好,感谢您的反馈。 item.status 是正确的,因为我使用的是 foreach(模型中的 var item)。如果我使用 modelItem.status 它会产生一个错误,指出 IEnumerable 不包含状态的定义... 好的,我看到你的问题出现在这条线上

以上是关于下拉列表值的更改不会将更新的值返回给控制器的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 视图需要将选定的下拉列表和日历日期传递给模型

如何检查用户何时更改选择下拉列表的值?

从具有不同值的逗号分隔 JSON 对象填充 html 下拉列表

如何在下拉列表更改时更新两个文本字段

如何在编辑页面的下拉列表中获取先前选择的值

如何创建多个从同一个数组中获取值的动态下拉列表,而无需更改 Javascript 中的其他下拉列表