“禁用”复选框只在第一次生效

本文关键字:第一次 禁用 复选框 | 更新日期: 2023-09-27 18:16:35

我将订单列表传递给我的视图并在屏幕上显示它们:

 @for (int i = 0; i < Model.AllOrders.Count; i++)
     {
    <text>
       <tr>
            <td width="15%">@Model.AllOrders[i].CustomerName</td>   
            <td width="15%">@Model.AllOrders[i].CustomerAddress</td>
            <td width="15%">@Model.AllOrders[i].CustomerPhoneNumber</td>
            <td width="15%">@Model.AllOrders[i].CustomerEmail</td>
            <td width="15%">@Model.ModelBikeMapping[@Model.AllOrders[i].BicycleModel]</td>
            <td width="15%">@Model.SizeMapping[@Model.AllOrders[i].BicycleSize]</td>
            <td width="15%">@Model.ColourMapping[@Model.AllOrders[i].BicycleColour]</td>
            <td width="15%">@Html.CheckBoxFor(x => @Model.AllOrders[i].Shipped)</td>
            <td width="15%">@Html.HiddenFor(item => Model.AllOrders[i].CustomerName)</td>
            <td width="15%">@Html.HiddenFor(item => Model.AllOrders[i].CustomerAddress)</td>
            <td width="15%">@Html.HiddenFor(item => Model.AllOrders[i].CustomerPhoneNumber)</td>
            <td width="15%">@Html.HiddenFor(item => Model.AllOrders[i].CustomerEmail)</td>
            <td width="15%">@Html.HiddenFor(item => Model.AllOrders[i].BicycleModel)</td>
            <td width="15%">@Html.HiddenFor(item => Model.AllOrders[i].BicycleSize)</td>
            <td width="15%">@Html.HiddenFor(item => Model.AllOrders[i].BicycleColour)</td>
            <td width="15%">@Html.HiddenFor(item => Model.AllOrders[i].Shipped)</td>              
       </tr>
    </text>
     }   
</table>
 <p>
     <input type="submit" value="Update" />
 </p>

从这里,用户可以选中或取消选中'Shipped'复选框,并单击'Update',将新的'Shipped'值传递给更新db表的控制器。这一切都很好。但是,如果复选框是TRUE,我想禁用它,因为你只能运送一个项目一次。

第四尝试:

@if (@Model.AllOrders[i].Shipped)
            {
                <td width="15%">@Html.CheckBoxFor(x => @Model.AllOrders[i].Shipped, new { disabled = "disabled" })</td>
                <td width="15%">@Html.HiddenFor(item => Model.AllOrders[i].Shipped)</td>  
            }
            else
            {
                <td width="15%">@Html.CheckBoxFor(x => @Model.AllOrders[i].Shipped)</td>
                <td width="15%">@Html.HiddenFor(item => Model.AllOrders[i].Shipped)</td>  
            }

这样做的问题是,用户可以更新一个新的记录从unshipped[F]到shipped[T]和db更新正确,但所有现有的TRUE 'shipped'值被传递回FALSE'unshipped'给控制器。这和我的逻辑有关,还是传递了隐藏的for ?请通知

“禁用”复选框只在第一次生效

我认为你的问题是模型绑定器与模型交互的方式。

根据我所看到的,我希望你的模型看起来像

public class ModelType
{
public List<Order> AllOrders {get; set;}
}

当您尝试在表单中循环遍历此内容并将其发送回服务器时,它会变得有点古怪。解决这个问题的最快和最简单的方法是在你的模型中添加一个属性,然后把它作为一个隐藏字段放在你的表单中。

public class ModelType
{
public List<Order> AllOrders {get; set;}
public int Id {get; set;}
}

然后将Id作为隐藏值添加到表单中。

我认为解决这个问题的正确方法是使用Html。在其中,您将删除for循环并用编辑器替换它。我在编辑器上也遇到了一些奇怪的事情,主要是它想要与列表中的T命名相同,并位于共享文件夹中。但是我建议你去看看它,不过添加Id prop(或任何其他真的)应该是一个快速修复你。