Wie zu Bearbeiten und zu Speichern ViewModels Daten zurück in die Datenbank
Habe ich ein ViewModel, das sich mit drei Einheiten, um Daten aus allen Entitäten, die in einem Formular anzeigen. Obwohl ich gelungen, die Umsetzung der gleichen. Aber ich habe keine Ahnung, wie das Bearbeiten und Speichern der Daten zurück in die Datenbank. Meine model-Klassen verbunden sind durch die eins-zu-eins-Beziehung.
Meine Modelle sind:
public class Doctor
{
public int DoctorId { get; set; }
public string Name { get; set; }
public string Speciality { get; set; }
public virtual DoctorAddress DoctorAddress { get; set; }
public virtual DoctorCharge DoctorCharge { get; set; }
public virtual DoctorAvailablity DoctorAvailablity { get; set; }
}
public class DoctorAddress
{
public string Address { get; set; }
public string City { get; set; }
public int DoctorId { get; set; }
public virtual Doctor Doctor { get; set; }
}
public class DoctorCharge
{
public decimal OPDCharge { get; set; }
public decimal IPDCharge { get; set; }
public int DoctorId { get; set; }
public virtual Doctor Doctor { get; set; }
}
Mein ViewModel:
public class DoctorViewModel
{
public Doctor Doctor { get; set; }
public DoctorAddress DoctorAddress { get; set; }
public DoctorCharge DoctorCharge { get; set; }
}
Mein Controller ist:
public ActionResult Index()
{
var model = from t1 in db.Doctors
join d in db.DoctorAddress on t1.DoctorId equals d.DoctorId into listi
join dc in db.DoctorCharges on t1.DoctorId equals dc.DoctorId into listj
from d in listi.DefaultIfEmpty()
from dc in listj.DefaultIfEmpty()
select new DoctorDetailsViewModel.DoctorViewModel { Doctor = t1, DoctorAddress = d, DoctorCharge = dc };
return View(model.ToList());
}
Meine Ansicht ist:
@model XXX.DoctorDetailsViewModel.DoctorViewModel
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Doctor</legend>
<div class="editor-label">
Name
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Doctor.Name)
</div>
<div class="editor-label">
OPD Charge
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DoctorCharge.OPDCharge)
</div>
<div class="editor-label">
Address
</div>
<div class="editor-field">
@Html.EditorFor(model => model.DoctorAddress.Address)
</div> <p>
<input type="submit" value="Create" />
</p>
</fieldset>}
Meine Controller-Klasse:
public ActionResult Create()
{
return View();
}
//
//POST: /Doctor/Create
[HttpPost]
public ActionResult Create(Doctor doctor)
{
if (ModelState.IsValid)
{
db.Doctors.Add(doctor);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(doctor);
}
Mir bitte helfen wie ich das mache. Vielen Dank im Voraus.
- Sie haben im Grunde bekam es. Deine action-Methode Erhalt der POST erhalten sollte, die den gleichen Typ wie das view-Modell, d.h.
DoctorViewModel
. Das Modell Bindung der MVC-Framework wird automatisch die Zuordnung der input-Felder der entsprechenden Eigenschaften in der Ansicht Modell-basierend auf Ihren Namen. - Wie können Arzt und DoctorCharge Personen können eine eins-zu-eins-Beziehung?
- Der Arzt-Klasse hat eine DoctorCharge Eigenschaft und Umgekehrt.
- Hab mein Kommentar helfen, die Dinge erklären oder haben Sie weitere Fragen?
- Für die edition arbeiten, haben Sie, um Ihre
DoctorId
in einem versteckten Feld, oder Sie werden am Ende die Schaffung neuer Doktor, jedes mal, wenn Sie sparen. z.B.Html.HiddenFor(model => model.Doctor.DoctorId)
- Nein, ich bin immer Fehler:
- Fehler : Die aktuelle Anforderung für die Aktion "erstellen" auf controller-Typ 'DoctorController' ist mehrdeutig zwischen folgenden Maßnahmen Methoden: System.Web.Mvc.ActionResult Create(HMS.Modelle.Arzt) auf Typ HMS.Controller.DoctorController System.Web.Mvc.ActionResult Create(HMS.ViewModels.DoctorDetailsViewModel) auf Typ HMS.Controller.DoctorController
- Sie haben gebeten, 8 Fragen, so weit, hatte Antworten auf 5 von Ihnen, und haben Sie nicht bekommen feedback auf eine einzelne vorgeschlagene Antwort. Haben keine Antworten auf Ihre Fragen Ihnen geholfen, so weit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier, für die Erstellung von
Erste von allen, es ist wirklich gut, dass Sie mit
ViewModels
aber für diesen speziellen Fall, es ist wahrscheinlich nicht nötig, IhreCreate
Sicht könnte so Aussehen:Dann Ihre
Doctor
controller:Wenn Sie möchten, um Ihr ViewModel dann könnte es so Aussehen:
Für diese Antwort ich bin mit Tom Dykstra ist Tutorial Anleitung Umsetzung Basic CRUD-Funktionalität mit dem Entity Framework in ASP.NET MVC-Anwendung in ViewModel Kontext.
Dem tutorial verwendet TryUpdateModel(TModel, String, String[]) Aufruf der Methode zum aktualisieren einer einzelnen
Student
Modell inEdit
Methode.TryUpdateModel
Methode gibttrue
wenn die Aktualisierung erfolgreich war, sonst gibt esfalse
. Über den ersten parameter fürTryUpdateModel
Aufruf der Methode ist dieStudent
Modell (studentToUpdate
). Der 2. parameter ist ein Präfix für die Suche von Werten in den Wert-provider (leere Zeichenfolge""
). Der 3. parameter ist eine Liste von Eigenschaften, die aktualisiert werden:”LastName", "FirstMidName", "EnrollmentDate"
Machen die oben genannten arbeiten für
DoctorViewModel
, der zweite parameter (Präfix) muss auch verwendet werden. Zum Beispiel fürDoctor
Modell:Dem Präfix
"Doctor"
ist erforderlich fürTryUpdateModel
Methode nennen, weil, wennDoctorViewModel
verwendet wird, kann es nicht findenDoctor
Modell die Parameter anders. Zum Beispiel die unten Watch-Fenster zeigt, wie das Formular die Werte sind dargestellt in Visual Studio im debug-Modus für die edit-Methode:in
Edit
anzeigen-code unten:erzeugt den folgenden html-Code:
Hier ist code für
Edit
Methode fürDoctorViewModel
Es ist auch eine gute Idee, fügen Sie ValidateAntiForgeryToken - Attribut, um den code zu verhindern, dass cross-site request forgery.
Update
Ich habe auch einige kleine änderungen an den model-Klassen durch hinzufügen von Attributen. Dies ermöglicht Modelle mit Beziehung zu leichter gefunden werden:
Daher Modelle unten haben
[Key]
oder[Key, ForeignKey("Doctor")]
AttributeFeedback in Bezug ViewModel-updates wird begrüßt. Vor kurzem Stand ich vor ähnlichen problem in meinem Projekt, und das war der Ansatz, den ich verwendet, um dieses Problem zu lösen. Ich denke, es gibt alternative Möglichkeiten zum Umgang mit diesem Problem.