Как это сделать? - PullRequest
       17

Как это сделать?

0 голосов
/ 05 марта 2020

Интересно, как реорганизовать такой код? Это метод в контроллере, и я передаю 2 списка выбора в Html через ViewBag.

public async Task<IActionResult> Index()
{
    var teacherInfo =  context.Teachers.OrderBy(x => x.Id);
    IEnumerable<SelectListItem> selectList = from s in teacherInfo
                                             select new SelectListItem
                                             {
                                                 Value = s.Id.ToString(),
                                                 Text = s.FirstName + " " + s.LastName.ToString()
                                             };
    ViewBag.TeacherId = new SelectList(selectList, "Value", "Text");

    var studentInfo = context.Students.OrderBy(x => x.Id);
    IEnumerable<SelectListItem> selectListStudents = from s in studentInfo
                                             select new SelectListItem
                                             {
                                                 Value = s.Id.ToString(),
                                                 Text = s.FirstName + " " + s.LastName.ToString()
                                             };
    ViewBag.StudentId = new SelectList(selectListStudents, "Value", "Text");


    return View();

}

Я пробовал это, но кажется, что я не могу использовать generi c, как это, потому что T не имеет определения для Id и других полей:

private async Task<IEnumerable<SelectListItem>> GetSelectListItem<T>(IOrderedQueryable<T> dbData)
{
    IEnumerable<SelectListItem> selectList = from s in dbData 
                                             select new SelectListItem
                                             {
                                                 Value = s.Id.ToString(),
                                                 Text = s.FirstName + " " + s.LastName.ToString()
                                             };
    return selectList;
}

Любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Вы можете создать универсальный c класс для классов учеников и учителей, которые будут наследоваться.

public class BaseClassForSelectItems
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

 public class Students: BaseClassForSelectItems
{ 
}

  public class Teachers: BaseClassForSelectItems
{ 
}

public async Task<IActionResult> Index()
    {
        var teacherInfo = context.Teachers.OrderBy(x => x.Id);
        IEnumerable<SelectListItem> selectList = await GetSelectListItem(teacherInfo);
        ViewBag.TeacherId = new SelectList(selectList, "Value", "Text");
        var studentInfo = context.Students.OrderBy(x => x.Id);
        IEnumerable<SelectListItem> selectListStudents = await GetSelectListItem(studentInfo);
        ViewBag.StudentId = new SelectList(selectListStudents, "Value", "Text");
        return View();
}


    private async Task<IEnumerable<SelectListItem>> GetSelectListItem<T>(IOrderedQueryable<T> dbData) where T : BaseClassForSelectItems
    {
        IEnumerable<SelectListItem> selectList = from s in dbData
                                                 select new SelectListItem
                                                 {
                                                     Value = s.Id.ToString(),
                                                     Text = s.FirstName + " " + s.LastName.ToString()
                                                 };
        return selectList;
    }
0 голосов
/ 05 марта 2020

Вам нужно ограничить T интерфейсом, который содержит эти свойства

internal interface IListItem
{
    int Id { get; }
    string FirstName { get; }
    string LastName { get; }
}

Затем заставьте вашего ученика и учителя реализовать этот интерфейс.

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