2016-07-18 11 views
4

Ich habe diese Modelle und ein Ansichtsmodell. Bei der Formularbuchung zum Erstellen der Einträge wird der ausgewählte Wert für WardID und DoctorID in der Controller-POST-Methode zu Null.Übergeben Sie den ausgewählten Wert in der Dropdownliste von der Ansicht an den Controller, wenn der Formulareintrag

Ansicht Code

@model NewClient.HospitalMgt.ViewModel.PatientAdmissionViewModel 
.... 
@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.Admission.WardID, "Ward") 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("WardID", String.Empty) 
      @Html.ValidationMessageFor(model => model.Admission.WardID) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.Admission.DoctorID, "Doctor") 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("DoctorID", String.Empty) 
      @Html.ValidationMessageFor(model => model.Admission.DoctorID) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Patient.PatientName) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Patient.PatientName) 
      @Html.ValidationMessageFor(model => model.Patient.PatientName) 
     </div> 
     .... //more controls for properties of Patient 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Admission.AdmissionNumber) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Admission.AdmissionNumber) 
      @Html.ValidationMessageFor(model => model.Admission.AdmissionNumber) 
     </div> 
     .... //more controls for properties of Admission 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

Controller-Code

public ActionResult Create() 
{ 
    ViewBag.WardID = new SelectList(db.Wards, "WardID", "WardNumber"); 
    ViewBag.DoctorID = new SelectList(db.Doctors, "DoctorID", "DoctorName"); 
    return View(); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(PatientAdmissionViewModel Id) 
{ 
    if (ModelState.IsValid) 
    { 
     var c = new Patient() 
     { 
      Address = Id.Patient.Address, 
      ContactNumber = Id.Patient.ContactNumber, 
      EmergencyContact = Id.Patient.EmergencyContact, 
      PatientName = Id.Patient.PatientName, 
     }; 
     var a = new Admission() 
     { 
      AdmissionNumber = Id.Admission.AdmissionNumber, 
      AdmissionDate = Id.Admission.AdmissionDate, 
      **WardID = Id.Admission.WardID, //becomes zero 
      DoctorID = Id.Admission.DoctorID //becomes zero** 
     }; 
     db.Patients.Add(c); 
     db.Admissions.Add(a); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    ViewBag.WardID = new SelectList(db.Wards, "WardID", "WardNumber", Id.Admission.WardID); 
    ViewBag.DoctorID = new SelectList(db.Doctors, "DoctorID", "DoctorName", Id.Admission.DoctorID); 
    return View(Id); 
} 

Modelle und Ansicht Modelle

//[NotMapped] 
public class PatientAdmissionViewModel 
{ 
    public Patient Patient { get; set; } 
    public Admission Admission { get; set; } 
} 

public class Patient 
{ 
    public int PatientID { get; set; } 
    [Required(ErrorMessage = "A Patient Name is required")] 
    public string PatientName { get; set; } 
    public string Address { get; set; } 
    [Required(ErrorMessage = "A Contact Number is required")] 
    public string ContactNumber { get; set; } 
    public string EmergencyContact { get; set; } 
    public virtual Ward Ward { get; set; } 
} 

public class Admission 
{ 
    public int AdmissionID { get; set; } 
    public string AdmissionNumber { get; set; } 
    public Nullable<int> PatientID { get; set; } 
    public int WardID { get; set; } 
    public int DoctorID { get; set; } 
    public System.DateTime AdmissionDate { get; set; } 
    public virtual Ward Ward { get; set; } 
    public virtual ICollection<PatientPayment> PatientPayments { get; set; } 
} 

Antwort

2

Sie verwenden von @Html.DropDownList("WardID", String.Empty) und @Html.DropDownList("DoctorID", String.Empty) sind Eingänge mit name="WardID" und name="DoctorID" Erzeugung jeweils, aber Sie Modus l enthält keine Eigenschaften mit diesen Namen (es enthält jedoch eine Eigenschaft namens Admission, die diese Eigenschaften enthält).

Sie "View-Modell" ist nicht wirklich ein View-Modell (ein View-Modell sollte keine Eigenschaften enthalten, die Datenmodelle beim Editieren sind). Ihr Ansichtsmodell sollte auch Eigenschaften für die SelectLists enthalten, damit Sie sich stark an Ihr Modell binden können. Ihre Ansicht Modell benötigt

public class PatientAdmissionViewModel 
{ 
    [Display(Name = "Ward"] 
    [Required(ErrorMessage = "Please select a ward")] 
    public int? SelectedWard { get; set; } 
    [Display(Name = "Doctor"] 
    [Required(ErrorMessage = "Please select a doctor")] 
    public IEnumerable<SelectListItem> WardList { get; set; } 
    public int? SelectedDoctor { get; set; } 
    public IEnumerable<SelectListItem> DoctorList { get; set; } 

    public string PatientName { get; set; } 
    ... // other properties of Patient that you need in the view 

    public string AdmissionNumber{ get; set; } 
    ... // other properties of Admission that you need in the view 
} 

und in der GET-Methode sein, um eine Instanz der View-Modell initialisieren, legen Sie seine Eigenschaften und sendet sie der Ansicht

public ActionResult Create() 
{ 
    var model = new PatientAdmissionViewModel() 
    { 
     WardList = new SelectList(db.Wards, "WardID", "WardNumber"), 
     DoctorList = new SelectList(db.Doctors, "DoctorID") 
    }; 
    return View(model); 
} 

und in der Ansicht

@Html.DropDownListFor(m => m.SelectedWard, Model.WardList, "-Please select-") 
.... 
@Html.DropDownListFor(m => m.SelectedDoctor, Model.DoctorList, "-Please select-") 

und schließlich initialisieren Sie in der POST-Methode neue Instanzen Ihrer Datenmodelle, legen ihre Eigenschaften basierend auf den Werten in den Ansichtsmodellen fest und speichern die Datenmodelle.

Ich empfehle auch, lesen Sie die Antworten auf What is ViewModel in MVC?.

+0

Sie haben versucht, eine Bearbeitung auf meine Antwort zu machen. Diese Änderung war falsch und ich habe sie abgelehnt. Wenn Sie beim POST einen Fehler erhalten, dann lesen Sie [diese Frage/Antwort] (http://stackoverflow.com/questions/34366305/the-viewdata-item-that-has-the-key-xxx-is-of- type-system-int32-but-muss-be-o) –

0

anstelle dieses

@Html.DropDownList("WardID", String.Empty) 
@Html.DropDownList("DoctorID", String.Empty) 

Verwendung dieser auf Sicht

@Html.DropDownListFor(model => model.Admission.WardID, (SelectList)ViewBag.WardID, "--Select One--") 
@Html.DropDownListFor(model => model.Admission.DoctorID, (SelectList)ViewBag.DoctorID, "--Select One--") 

Verwendung dieser auf Controller

WardID = Id.Admission.WardID, 
DoctorID = Id.Admission.DoctorID 
+0

wird auch dieses versuchen, große Hilfe von den Experten macht Spaß zu Code – Sanjeewa

+0

Die Validierungen und die Reihenfolge der Eigenschaften müssen sonst passen ** Das ViewData Element, das hat den Schlüssel '' ist vom Typ 'System.Int32' aber muss vom Typ 'IEnumerable sein ** Fehler kommt 'public IEnumerable WardList {get; einstellen; } [Erforderlich (ErrorMessage = "Bitte wählen Sie eine Station")] public int? SelectedWard {bekommen; einstellen; } public IEnumerable DoctorList {get; einstellen; } [Erforderlich (ErrorMessage = "Bitte wählen Sie einen Arzt")] public int? SelectedDoctor {erhalten; einstellen; } ' – Sanjeewa

Verwandte Themen