Как сохранить входные данные представлений в разных таблицах? - PullRequest
0 голосов
/ 10 декабря 2018

Я новичок в ASP.NET MVC, и в настоящее время я использую EF с подходом, основанным на базе данных, для своей работы.Все идет хорошо, и каждая модель имеет свой контроллер и просматривает файлы.Я сталкиваюсь с проблемой, когда хочу сохранить многомодельные данные в представлении.

В моем случае:

  1. У меня есть форма ASP.NET MVC для данных подробностей учителя, а другая - для учителяистория занятости (эти два автоматически генерируются из подхода базы данных лесов)
  2. Я хочу представление Create.cshtml, где пользователь вводит данные учителя и историю занятости, и это может быть сохранено в их собственных таблицах.Поэтому я использую кортеж и следую тому, что сделали ( Несколько моделей в представлении ) и ( Две модели в одном представлении в ASP MVC 3 ).В результате я успешно создаю данные учителя и историю занятости в представлении (интерфейс Just).
  3. Но я не знаю, как сохранить входные данные в разные таблицы (2 таблицы: teacher, employmentHistory).Теперь, когда я сохраняю ввод, ничего не происходит.

Полагаю, мне нужно что-то сделать с частями контроллера, пожалуйста, дайте мне несколько идей о том, как это сделать.

Заранее спасибо

1 Ответ

0 голосов
/ 10 декабря 2018

Во-первых, добро пожаловать в StackOverflow!

Вы правы, вы должны что-то сделать с контроллером.

  1. Я бы создал ViewModel для представления.Делая это, вы можете проецировать данные из базы данных любым способом, который необходим в представлении.Кроме того, при таком подходе вы не возвращаете полную сущность, возможно, там есть некоторая конфиденциальная информация.И вы также можете воспользоваться преимуществами проверки модели.(Например, что если в какой-то момент вам нужно добавить другое поле из другой сущности?)
  2. Я бы также создал частичные представления для информации в модели представления и передал эту модель в частичное представление, таким образомвозможность повторного использования представлений, если это необходимо.
  3. При передаче данных в контроллер вы можете передать ViewModel и затем сохранить данные в базе данных.

Поскольку вы не предоставили никакой информации о модели ваших классовЯ приведу ниже пример.В любом случае (просмотрите модель или пример кортежа, которому вы следовали), вы должны изменить код контроллера, аналогично тому, что я пишу ниже.

public class TeacherViewModel
 {
    //teacher details
    [Required]
    public int TeacherId {get; set;}
    [Required]
    public string TeacherName {get; set;}
    // {...}
    //teacher employment info
    //here you can have a list of information or the last entry in the history, 
    //or what's required to add a new entry
    public string LastWorkPlace {get; set;}
    public DateTime From {get; set;}
    public To {get; set; }
    //{...}
 }


public class TeacherController: Controller
{
     //{...}
     [HttpPost]        
     public ActionResult SaveTeacherInfo(TeacherViewModel model){
          if (ModelState.IsValid) {
              var teacher = new TeacherEntity 
              {
                 TeacherId = model.TeacherId, //if update otherwise leave blank
                 TeacherName = model.TeacherName
                 //{...}
              };
              //your context name here
              _dbContext.Teachers.Add(teacher);
              var teacherEmploymentInfo = new TeacherEmploymentHistory
              {
                 TeacherId = teacher.TeacherId,
                 LastWorkPlace = model.LastWorkPlace,
                 From = model.From,
                 To = model.To
                 //{...}
              };
              _dbContext.TeachersEmploymentInfo.Add(teacherEmploymentInfo);
              _dbContext.SaveChanges();
             //_dbContext.SaveChangesAsync(); if using async await
          }
          return View(model); //return any validation errors from the view model 
          // to the user to fix.
     }
}

Если вы используете ErrorHandler в качестве глобального фильтра, нет необходимостидля блока try..catch, если вы не планируете возвращать пользовательские ошибки (например, BusinessException или DatabaseException) из контроллера, если нет, вам следует заключить код в блок try..catch.

...