mvc Выпадающий список с моделью списка типов

Я новичок в MVC, однако я пытался использовать раскрывающийся список в представлении с моделью типа List‹>. Это необходимо для создания нескольких записей на одной странице.

Мне удалось успешно создать представление, не относящееся к типу List‹>, и по одной записи за раз, но, несмотря на много поисковых запросов, я не могу реализовать решение, когда реализую представление с моделью типа List‹ >.

Модель

public class Product
{
    public int ProductID { get; set; }

    public string Description { get; set; }

    public int VatRateID { get; set; }

    [ForeignKey("VatRateID")]
    public virtual VatRate VatRate { get; set; }

}

Контроллер

    // GET: /Product/Bulkdata
    public ActionResult BulkData()
    {
        PopulateVatRateDropDownList();
        List<Product> model = new List<Product>();
        model.Add(new Product
                        {
                            ProductID = 0,
                            Description = "",
                            VatRateID = 1
                        }
                );
        return View(model);
    }

    //
    // POST: /Product/Bulkdata

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult BulkData(
        [Bind(Include = "Description,VatRateID")]
        List<Product> products)
    {

        try
        {
            if (ModelState.IsValid)
            {
                foreach (var p in products)
                {
                    db.Product.Add(p);
                }
                db.SaveChanges();
                return RedirectToAction("Index");
            }
        }
        catch (DataException)
        {
            ModelState.AddModelError("", "Bulk - Unable to save changes, Try again, and if the probelm persists contact your administrator");
        }
        PopulateVatRateDropDownList();
        return View(products);
    }

    private void PopulateVatRateDropDownList(object selectedVatRate = null)
    {
        var vatRateQuery = from v in db.VatRate
                           select v;
        ViewBag.VatRateID = new SelectList(vatRateQuery, "VatRateID", "VatRateDescription", selectedVatRate);
    }

Вид

   @if (Model != null && Model.Count > 0)
   {
       int j = 0;
       foreach (var i in Model)
       {

            <tr style="border:1px solid black">
                <td>
                    @Html.EditorFor(m => m[j].Description)
                    @Html.ValidationMessageFor(m => m[j].Description)
                </td>
                <td>
                    @Html.DropDownList("VatRateID", String.Empty)
                    @Html.ValidationMessageFor(m => m[j].VatRateID)
                </td>
                <td>
                   @if (j > 0)
                   {
                        <a href="#" class="remove">Remove</a>
                   }
                </td>
            </tr>
            j++;
       }
   }

Когда я запускаю приложение с этим кодом, 0 всегда возвращается к vatRateID. Я пробовал множество других решений, кроме приведенных выше, включая ASP.NET MVC DropDownListFor с моделью типа List‹string›. Как я уже упоминал, я новичок в mvc, поэтому я знаю, что, вероятно, мне не хватает чего-то простого. Любая помощь будет очень признательна.

Спасибо


person user2046411    schedule 03.05.2016    source источник
comment
Вы не можете использовать цикл foreach. См. этот ответ   -  person    schedule 03.05.2016
comment
И ваше использование DropDownList() не имеет смысла - его привязка к VatRateID, но ваша модель List<Product>, а List<T> не содержит свойства с именем VatRateID. Вы также исключаете все из привязки, используя атрибут [Bind].   -  person    schedule 03.05.2016
comment
Спасибо, Стивен, не могли бы вы привести пример того, как я должен использовать DropDownList() в приведенном выше примере.   -  person user2046411    schedule 04.05.2016
comment
Ваш код не имеет смысла, поэтому я не знаю, что вы пытаетесь сделать, но лучше всего предположить, что это for(int i = 0; i < Model.Count; i++) { @Html.DropDownListFor(m => m[i].VatRateID, (IEnumerable<SelectListItem>)ViewBag.VatRateList) .... }, и измените свойство ViewBag на VatRateList (оно не может совпадать со свойством, к которому вы привязаны). И удалите атрибут [Bind]   -  person    schedule 05.05.2016
comment
Стивен, большое спасибо. Именно с ним я и боролся DropDownListFor, поменял на то, что вы предложили выше и поменял свойство ViewBag на VatRateList - все работает.   -  person user2046411    schedule 05.05.2016


Ответы (1)


Ответ Стивена в комментариях:

В представлении изменил foreach на цикл for в соответствии со статьей в комментарии Стивена и использовал DropdDownListFor

@Html.DropDownListFor(m => m[i].VatRateID, (IEnumerable<SelectListItem>)ViewBag.VatRateList)

Также изменен контроллер, чтобы переименовать свойство ViewBag в VatRateList.

' private void PopulateVatRateDropDownList (объект selectedVatRate = null) { var vatRateQuery = from v in db.VatRate select v; ViewBag.VatRateID = new SelectList(vatRateQuery, "VatRateID", "VatRateDescription", selectedVatRate); } '

person user2046411    schedule 05.05.2016