2014-08-06 3 views
3

Im проходящего список заказов на мой взгляд, и отображение их на экране:Отключить флажок работает только первый раз

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

Отсюда пользователь может установить или снять «Доставлено» флажок и нажмите кнопку «Обновить ', который передает новое «отправленное» значение обратно контроллеру, который обновляет таблицу db. Все это прекрасно работает. Однако, если флажок 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] и обновление БД правильно, но все существующей ИСТИНЫ «погруженных» значение передаются обратно как FALSE'нагружены 'контроллеру. Является ли это чем-то связанным с моей логикой или передачей скрытого? Просьба сообщить

+0

две мысли здесь, 1. можете ли вы показать свою логику сообщений для обновления и 2. почему у вас есть скрытый для этого флажка? CheckBoxFor должно быть достаточно – nikolifish

+0

Спасибо за ответ Niko .... Я должен был включить скрытое поле, чтобы передать значение POST, в то время как checkBoxFor отображает значение на экране. Моя логика сообщений для обновления работает нормально, потому что, если я не отключу флажок, все это работает. его только тогда, когда я пытаюсь отключить флажки, которые уже выбраны, когда они отправляются обратно в POST как FALSE вместо TRUE – John

+0

Как выглядит ваша модель? Это просто контейнер для вашего списка заказов? – nikolifish

ответ

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 и заменить его на свой редактор. Я столкнулся с некоторыми странностями и с редактором, главным образом с тем, что он хочет, чтобы его называли так же, как ваш Т из списка и находились в общей папке. Но я бы рекомендовал изучить его, однако добавив, что Id prop (или любой другой действительно) должен быть для вас быстрым решением.

+0

Благодарим вас за ответ. да, я понимаю, что вы говорите, что я использовал что-то подобное в прошлом, чтобы решить другую проблему ... но это все еще не объясняет, почему, когда загружается страница и все предыдущие флажки, которые были ИСТИННЫ, поэтому отключены. Возвращаются к POST как FALSE, когда это должно быть ИСТИНА. Если я удаляю отключенные флажки для TRUE и просто отображается как обычно, правильное значение отправляется обратно в сообщение, TRUE для отмеченного, FALSE для unchecked – John

+0

Вы говорите, что он работает как предполагалось, если вы удаляете отключенный атрибут или флажок сам – nikolifish

+0

да все работает отлично, если я удаляю отключенный атрибут. Но поскольку я хочу отключить флажок, если он когда-либо был выбран, я добавил в @if (@ Model.AllOrders [i] .Shipped) (отметьте сообщение orignal), // если true отключить, если false, разрешите пользователю CHECK box .... но, как я сказал, когда я использую это, все существующие проверенные значения возвращаются как ЛОЖЬ, когда они должны быть ИСТИНЫ – John

Смежные вопросы