ASP.NET CORE MVC SelectList из коллекции объектов - PullRequest
0 голосов
/ 16 января 2019

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

public class Teacher
{
    public int ID { get; set; }

    public string FistName { get; set; }

    public string LastName { get; set; }

    public Class Class { get; set; }

    public string FullName
    {
        get
        {
            return $"{LastName} {FistName}";
        }
    }

    public override string ToString()
    {
        return FullName;
    }
}

и

public class Class
{
    public int ID { get; set; }

    public int TeacherID { get; set; }

    public string Name { get; set; }


    public Teacher Teacher { get; set; }

    public ICollection<Student> Students { get; set; }
}

Я хочу добавить вМой класс контролирует функциональность для создания нового экземпляра класса "Class", введя имя в текстовое поле и выбрав учителя из выпадающего списка.

Вот мои методы создания http get & post

    public IActionResult Create()
    {
        var teachers = from s in _context.Teachers
                           where s.Class == null
                           select s;

        ViewData["Teachers"] = new SelectList(teachers.ToList());
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(Class @class)
    {
        if (ModelState.IsValid)
        {
            @class.TeacherID = @class.Teacher.ID;
            _context.Add(@class);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        return View("Index");
    }

и форма для отправки пользовательских данных

<form asp-action="Create">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="Teacher" class="control-label"></label>
            <select asp-for="Teacher" class ="form-control" asp-items="ViewBag.Teachers"></select>
        </div>
        <div class="form-group">
            <label asp-for="Name" class="control-label"></label>
            <input asp-for="Name" class="form-control" />
            <span asp-validation-for="Name" class="text-danger"></span>
        </div>
        <div class="form-group">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </form>

В раскрывающемся списке отображаются правильные данные, но по какой-то причине внутри метода POST @ class.Teacher имеет значение null.Что я делаю не так?

Ответы [ 4 ]

0 голосов
/ 17 января 2019

Внести следующие изменения

Создайте http get метод, просмотрите Класс SelectList , установите ID на dataValueField в списке выбора и установите FullName на dataTextField в списке выбора

 public IActionResult Create()
    {
        var teachers = from s in _context.Teacher
                       where s.Class == null
                       select s;

        ViewData["Teachers"] = new SelectList(teachers.ToList(),"ID","FullName");
        return View();
    }

Тег выбора в форме

<select asp-for="TeacherID" class="form-control" asp-items="ViewBag.Teachers"></select>
0 голосов
/ 16 января 2019

"Teacher" - сложный класс, который всегда будет нулевым, я думаю, вы запутались, замените "Teacher" на "teacherID". EF сделает всю работу.

0 голосов
/ 17 января 2019

Сначала обновите ваш Create GET метод следующим образом:

public async Task<IActionResult> Create()
{
    var teachers = await _context.Teachers.Where(t => t.Class == null).ToListAsync();
    ViewData["Teachers"] = new SelectList(teachers,"ID","FullName");
    return View();
}

Затем напишите FormGroup для select list следующим образом:

<div class="form-group">
     <label asp-for="TeacherID" class="control-label">Teacher</label>
     <select asp-for="TeacherID" class ="form-control" asp-items="ViewBag.Teachers">
     </select>
     <span asp-validation-for="TeacherID" class="text-danger"></span>
</div>

Теперь обновите ваш Create POST метод следующим образом:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(Class @class)
{
    if (ModelState.IsValid)
    {
        _context.Classes.Add(@class); // now your @class is containing the `TeacheID` value selected from drop-down.
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    return View("Index");
}

Теперь все должно работать нормально!

0 голосов
/ 16 января 2019

Список выбора будет возвращать только примитивный тип (string, int и т. Д.), А не весь экземпляр класса. В результате вам нужно будет связать значение со свойством, которое также является таким примитивным типом. Поскольку у вас уже есть свойство TeacherID, вы можете просто использовать его. При сохранении EF исправит ссылку Teacher с соответствующим идентификатором.

<select asp-for="TeacherID" class ="form-control" asp-items="ViewBag.Teachers"></select>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...