Как вставить данные из ViewModel в базу данных с помощью раскрывающегося списка в представлении - PullRequest
2 голосов
/ 07 ноября 2019

У меня есть идея создать запись для базы данных, используя раскрывающийся список, уже содержащий данные из той же базы данных, но из других таблиц.

Моя частичная база данных выглядит следующим образом:

enter image description here

В Visual Studio я использовал автоматическое создание таблиц, я создал ModelView для пропуска с использованием Id. Идентификатор генерируется автоматически, поэтому нет необходимости использовать идентификатор для изменения номера идентификатора. Ниже представлены модели:

enter image description here

ModelView использует раскрывающийся список, а выбранные элементы из раскрывающихся списков должны быть перенесены в базу данных. вместе с основными данными, введенными пользователем.

Попытка кода программы:

Контроллер

public IActionResult Create()
{
    ObjectViewModel model = new ObjectViewModel();

    foreach (var object in _context.ObjectA)
    {
        model.ObjectA.Add(new SelectListItem { Text = object.A, Value = object.IdA });
    }

    foreach (var hear in _context.ObjectB)
    {
        model.ObjectB.Add(new SelectListItem { Text = object.B, Value = object.IdB });
    }

    foreach (var object in _context.ObjectC)
    {
        model.ObjectC.Add(new SelectListItem { Text = object.C, Value = object.IdC });
    }

    return View(model);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(string IdA, string IdB, string IdC)
{
    ObjectViewModel model = new ObjectViewModel();
    ObjectABC abc = new ObjectABC();

    if (ModelState.IsValid)
    {
        foreach (var object in _context.ObjectA)
        {
            model.ObjectA.Add(new SelectListItem { Text = object.A, Value = object.IdA });
        }

        if (IdA != string.Empty)
        {
            var objectsA = (from a in _context.ObjectABC
                            where a.IdA == IdA
                            select a).ToList();

            if (IdB != string.Empty)
            {
                var objectsB = (from b in _context.ObjectABC
                                where b.IdB == IdB
                                select b).ToList();

                foreach (var object in _context.ObjectB)
                {
                    model.ObjectB.Add(new SelectListItem { Text = object.B, Value = object.IdB });
                }

                if (IdC != string.Empty)
                {
                    var objectsC = (from c in _context.ObjectABC
                                    where c.IdC == IdC
                                    select c).ToList();

                    foreach (var object in _context.ObjectC)
                    {
                        model.ObjectC.Add(new SelectListItem { Text = object.C, Value = object.IdC });
                    }
                }
            }
        }

        _context.Add(abc);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    return View(model);
}

Просмотр

<form asp-action="Create">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="form-gr">
        <label asp-for="ObjectA" class="control-label"></label>
        <select asp-for="IdA" class="select-style" asp-items="Model.objectsA">
            <option value = "" > --Select option--</option>
        </select>
    </div>
    <div class="form-gr">
        <label asp-for="ObjectB" class="control-label"></label>
        <select asp-for="IdB" class="select-style" asp-items="Model.objectsB">
            <option value = "" > --Select option--</option>
        </select>
    </div>
    <div class="form-gr">
        <label asp-for="ObjectC" class="control-label"></label>
        <select asp-for="IdC" class="select-style" asp-items="Model.objectsC">
            <option value = "" > --Select option--</option>
        </select>
    </div>
    <div class="form-gr">
        <label asp-for="Price" class="control-label"></label>
        <input asp-for="Price" class="form-control" />
        <span asp-validation-for="Price" class="text-danger"></span>
    </div>
    <div class="form-gr">
        <input type = "submit" value="Create" class="btn btn-primary" />
    </div>
</form>

Но это не работает .. Есть идеи?

1 Ответ

1 голос
/ 07 ноября 2019

Вы не заполняете свойства ObjectABC, вы можете опубликовать действие создания следующим образом

 [HttpPost]
 [ValidateAntiForgeryToken]
 public async Task<IActionResult> Create(string IdA, string IdB, string IdC)
 {
       ObjectABC abc = new ObjectABC();

       if (ModelState.IsValid)
       {
          if (IdA != string.Empty && IdB != string.Empty && IdC != string.Empty)
                {
                    abc.IdA = IdA;
                    abc.IdB = IdB;
                    abc.IdC = IdC;
                    _context.Add(abc);
                    await _context.SaveChangesAsync();
                    return RedirectToAction(nameof(Index));
                }                
        }

        ObjectViewModel model = new ObjectViewModel();

        foreach (var object in _context.ObjectA)
                model.ObjectA.Add(new SelectListItem { Text = object.A, Value =object.IdA });          

        foreach (var hear in _context.ObjectB)
                model.ObjectB.Add(new SelectListItem { Text = object.B, Value = object.IdB }); 

        foreach (var object in _context.ObjectC)
                model.ObjectC.Add(new SelectListItem { Text = object.C, Value = object.IdC });

        model.IdA = IdA;
        model.IdB = IdB;
        model.IdC = IdC;

        return View(model);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...