2017-12-19 7 views
0

Von meinen zwei Modellen Student und InventoryRecord. Ich habe ein ViewModel namens TestViewModel erstellt. Ich bin verwirrt, wie schreibe ich meinen Controller?Führen Sie CRUD in Controller mit ViewModel in ASP.NET MVC

public class TestViewModel 
{ 
    //from Student model 
    [Key] 
    public string UserID { get; set; } 
    public string PhoneNumber{ get; set; } 
    public string Address{ get; set; } 
    //other properties 

    //from Inventory model 
    public string FathersName { get; set; } 
    public string FathersAddress { get; set; } 
    //other properties 

} 

Als ich meine nur Student Hauptmodell bin. So schreibe ich meinen Controller:

// GET: Students/CreateEdit 
    public ActionResult InventoryRecord() 
    { 
     var currentUserId = User.Identity.GetUserId(); 
     var newid = db.Students.FirstOrDefault(d => d.UserID == currentUserId); 

     if (newid == null) 
     { 
      newid = db.Students.Create(); 
      newid.UserID = currentUserId; 
      db.Students.Add(newid); 

     } 

     Student student = db.Students.Find(newid.UserID); 
     if (student == null) 
     { 
      return HttpNotFound(); 
     } 

     return View(student); 
    } 

    // POST: Students/CreateEdit 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult InventoryRecord(Student student) 
    { 

     var currentUserId = User.Identity.GetUserId(); 
     var userName = User.Identity.GetUserName(); 
     var u = db.Students.FirstOrDefault(d => d.UserID == currentUserId); 

     if (u == null) 
     { 
      u = db.Students.Create(); 
      u.UserID = currentUserId; 
      db.Students.Add(u); 

     } 

     if (ModelState.IsValid) 
     { 
      u.PhoneNumber = student.PhoneNumber; 
      u.Address = student.Address; 
      //other properties 

      db.SaveChanges(); 

      TempData["Message"] = "User: " + userName + ", details successfully updated!"; 
     } 

     return View(student); 
    } 

Jetzt bin ich wirklich verwirrt, wie hier vorzugehen. Wie sollte ich meinen Controller schreiben, wenn ich meine TestViewModel verwende? Jemand bitte zeigen Sie mir in die richtige Richtung. Vielen Dank.

+2

zuerst die '[Key]' Attribut entfernen (das EF verwandt ist, nicht anzeigen Modelle). In Ihrer POST-Methode initialisieren Sie neue Instanzen Ihrer Datenmodelle (oder wenn Ihre Daten bestehen, dann erhalten Sie die Datenmodelle aus der Datenbank basierend auf der ID) und legen ihre Eigenschaften basierend auf den Werten in den Ansichtsmodellen fest und speichern sie die Datenmodelle. –

+0

In Ihrer POST-Methode sollten Sie ein Instanzobjekt von TestViewModel erstellen und es mit gebuchten Daten in Ihrer Aktion füllen .. Das ist alles! – praguan

Antwort

0

Nun persönlich würde ich den Code aus dem Controller verschieben.

Zum Beispiel müssen Sie nur eine Instanz Ihrer TestViewModel erstellen und diese zu Ihrer Ansicht übergeben. Sie müssen möglicherweise auch Ihre Ansicht aktualisieren, wenn Sie das Modell in der cshtml-Datei angeben.

public ActionResult InventoryRecord() 
{ 
    var currentUserId = User.Identity.GetUserId(); 
    var newid = db.Students.FirstOrDefault(d => d.UserID == currentUserId); 

    if (newid == null) 
    { 
     newid = db.Students.Create(); 
     newid.UserID = currentUserId; 
     db.Students.Add(newid); 

    } 

    Student student = db.Students.Find(newid.UserID); 
    if (student == null) 
    { 
     return HttpNotFound(); 
    } 

    TestViewModel model = new TestViewModel 
    { 
     UserID = student.UserId, 
     PhoneNumber = student.PhoneNumber, 
     //add the rest. 
    }; 

    return View(model); 
} 
0

Anstatt Schüler Rückkehr Rückkehr TestViewModel

Student student = db.Students.Find(newid.UserID); 
    if (student == null) 
    { 
     return HttpNotFound(); 
    } 

    TestViewModel tvm = new TestViewModel() 
    { 
     UserID =student.Id, 
     PhoneNumber = student.PhoneNumber, 
     Address= student.Address 
    }; 

    return View(tvm); 
} 

und zweite Methode wird

public ActionResult InventoryRecord(TestViewModel tvm) 
Verwandte Themen