禁用复选框仅适用于第一次

时间:2014-08-06 13:09:18

标签: c# html asp.net-mvc-4 razor checkbox

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

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

在此处,用户可以选中或取消选中“已发货”复选框,然后单击“更新”,将新的“已发货”值传递回更新数据库表的控制器。 一切正常。但是,如果复选框为TRUE,我想禁用它,因为您只能运送一次项目。

iv尝试过:

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

这个问题是用户可以将新记录从未发货的[F]更新到发货[T]并且数据库更新正确但是所有现有的TRUE'发货'值都会被传回FALSE'unshipped'到控制器。这与我的逻辑或传递hiddenFor有关吗? 请指教

1 个答案:

答案 0 :(得分:0)

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

根据我所看到的情况,我希望您的模型看起来像

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.EditorFor,在其中删除for循环并将其替换为编辑器。我也遇到了编辑器的一些奇怪现象,主要是因为它希望从List中命名与T相同并且位于共享文件夹中。但我建议调查它,但是添加Id prop(或任何其他真正的)应该是一个快速解决方案。