Список предметов всегда ноль MVC 5 - PullRequest
0 голосов
/ 23 октября 2018

Я застрял в этой проблеме и не могу ее решить.

Это мой ViewModel

public class AddOrderReceive
{
  public string item_name { get; set; }
  public DateTime? date_received { get; set; }
  public decimal? quantity_received { get; set; }
  public bool IsSelected { get; set; }
  public decimal? item_rate { get; set; }
}

Это мой View

    @model List<newtest.Models.AddOrderReceive>

    @if(Model != null && Model.Count > 0)
    {
      for(var i = 0; i < Model.Count; i++)
        {
          <tr>
              @if(Model[i].quantity_remaining == 0)
              {
                <td colspan="6" class="text-center">Already Sent</td>
              }
              else
              {
                @Html.HiddenFor(r => Model[i].item_id)
                <td>@Html.CheckBoxFor(r => Model[i].IsSelected)</td>
                <td>@Html.EditorFor(r => Model[i].item_rate)</td>
              }
           </tr>
        }
  }  

И наконец, это мой Controller:

 [HttpGet]
    public ActionResult AddRAR(int? my_id)
    {
      try
      {
        var get_items = (from or in db.orders
                         where or.id == my_id
                         select new AddOrderReceive()
                         {
                           item_name = or.item_name,
                           quantity_received = or.quantity_receive,
                           date_received = or.date_receive,
                           order_receive_id = or.order_receive_id 
                         }).ToList();

foreach(var t in get_items)
 {
   var get_remain = (from ra in db.order_detail
                     where ra.contract_id == t.ca_id && ra.order_receive_id == t.order_receive_id 
                     select new
                     {
                       consump_quantity = ra.consump_quantity
                     });
                    t.quantity_remaining = t.quantity_received - get_remain.Sum(r => r.consump_quantity) ?? t.quantity_received;

                }
        return View(get_items);


    }
     catch(Exception ex)
     {

     }


    }  


[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddReceivng(List<AddOrderReceive> rc_form)
{
       //Some Logic
}

Проблема в том, что всякий раз, когда я публикую форму, она всегда будет null.Но когда я убираю этот блок:

@if(Model[i].quantity_remaining == 0)
{
    <td colspan="6" class="text-center">Already Sent</td>
}  

начинает работать.Я не знаю в чем проблема.Я искал везде, но все еще не могу выяснить проблему здесь.

1 Ответ

0 голосов
/ 23 октября 2018

Ваш блок кода @if(Model[i].quantity_remaining == 0), если он выполняется на первой итерации, означает, что индексаторы вашей коллекции не будут основаны на нулях.DefaultModelBinder требует, чтобы индексаторы коллекции начинались с нуля и были последовательными.

Вы можете изменить это поведение, включив скрытый ввод для индексатора.Также обратите внимание, что <input> не является допустимым дочерним элементом для <tr> и должно находиться внутри элемента <td>.

for(var i = 0; i < Model.Count; i++)
{
    @if(Model[i].quantity_remaining == 0)
    {
        <td colspan="6" class="text-center">Already Sent</td>
    }
    else
    {
        <td>
            <input type="hidden" name="Index" value="@i" /> // Add this
            @Html.HiddenFor(r => r[i].item_id)
            @Html.CheckBoxFor(r => r[i].IsSelected)
        </td>
        <td>@Html.EditorFor(r => r[i].item_rate)</td>
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...