“禁用”复选框只在第一次生效
本文关键字:第一次 禁用 复选框 | 更新日期: 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(或任何其他真的)应该是一个快速修复你。