2016-12-22 5 views
0

Ich hatte Probleme mit Viewmodels für eine Weile und ich möchte etwas aufheben. In meinem Viewmodel kann ich "index" anzeigen und ich kann einen neuen Mitarbeiter "create" hinzufügen, aber "Edit" funktioniert nicht.MVC viewmodel Edit zeigt nichts nach Httppost

Ich kann die "bearbeiten" -Seite zeigen, meine Bearbeitungen vornehmen (wie den Namen ändern), aber wenn ich zurück posten, erscheinen alle Daten als null. In der "create", nachdem ich die Einfügung poste, zeigt der Controller die Änderungen (EmployeeViewModel) und fügt den Datensatz ein. Es zeigt nur nicht, wenn ein "Bearbeiten" gemacht wird.

Ist das etwas in Viewmodels oder gibt es etwas anderes?

Hier ist meine Viewmodel-Klasse (Datenbank zuerst):

public partial class Employee 
    { 
     public int EmployeeId { get; set; } 
     public string Name { get; set; } 
     public Nullable<int> DepartmentId { get; set; } 
     public string Address { get; set; } 

     public virtual Department Department { get; set; } 
    } 

public partial class Department 
    { 
     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
     public Department() 
     { 
      this.Employees = new HashSet<Employee>(); 
     } 

     public int DepartmentId { get; set; } 
     public string DepartmentName { get; set; } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
     public virtual ICollection<Employee> Employees { get; set; } 
    } 

    public class EmployeeViewModel 
    { 
     public int EmployeeId { get; set; } 
     public string Name { get; set; } 
     public Nullable<int> DepartmentId { get; set; } 
     public string Address { get; set; } 
     public string DepartmentName { get; set; } 

    } 

Hier ist mein Controller:

public class TestController : Controller 
    { 
     public db dContext = new db(); 
     public ActionResult Index() 
     { 
      List<Employee> employeelist = dContext.Employees.ToList(); 
      EmployeeViewModel employeeVM = new EmployeeViewModel(); 

      List<EmployeeViewModel> employeeVMList = employeelist.Select(x => new EmployeeViewModel 
      { 
       Name = x.Name, 
       EmployeeId = x.EmployeeId, 
       Address = x.Address, 
       DepartmentId = x.DepartmentId, 
       DepartmentName = x.Department.DepartmentName 
      }).ToList(); 
      return View(employeeVMList);  
     } 
     public ActionResult Create() 
     { 
      return View(); 
     } 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create(EmployeeViewModel employeeVM) 
     { 
      if (ModelState.IsValid) 
      { 
       Employee e = new Employee(); 
       e.EmployeeId = employeeVM.EmployeeId; 
       e.Name = employeeVM.Name; 
       e.DepartmentId = employeeVM.DepartmentId; 
       e.Address = employeeVM.Address; 

       dContext.Employees.Add(e); 
       dContext.SaveChanges(); 

       return RedirectToAction("Index"); 
      } 
      return View("Index"); 
     } 

     public ActionResult Edit(EmployeeViewModel em , int? id) 
     { 
      var dbEmpVM = (from e in dContext.Employees 
          join d in dContext.Departments 
          on e.DepartmentId equals d.DepartmentId 
          where e.EmployeeId == id 
          select new EmployeeViewModel 
          { 
           EmployeeId = e.EmployeeId, 
           DepartmentId=e.DepartmentId, 
           Address=e.Address, 
           Name=e.Name, 
           DepartmentName=d.DepartmentName 
          }).ToList();  
      return View(dbEmpVM ); 
     } 

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Edit(EmployeeViewModel model, int id) 
     { 
      string name = Request.Form["EmployeeId"]; 
      string naaanm = model.EmployeeId.ToString(); 

      return RedirectToAction("Index"); 
     } 
    } 

Und hier ist mein Edit:

@model IEnumerable<MVCTutorial.Models.EmployeeViewModel> 
@{ 
    ViewBag.Title = "Edit"; 
} 
<h4>(EmployeeViewModel)</h4> 
@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    foreach (var item in Model) 
    { 
<div class="form-group"> 
    @Html.LabelFor(i => item.EmployeeId, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.EditorFor(i => item.EmployeeId, new { htmlAttributes = new { @class = "form-control" } }) 
     @Html.ValidationMessageFor(i => item.EmployeeId, "", new { @class = "text-danger" }) 
    </div> 
</div> 
<div class="form-group"> 
    @Html.LabelFor(i => item.Name, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.EditorFor(i => item.Name, new { htmlAttributes = new { @class = "form-control" } }) 
     @Html.ValidationMessageFor(i => item.Name, "", new { @class = "text-danger" }) 
    </div> 
</div> 
<div class="form-group"> 
    @Html.LabelFor(i => item.DepartmentId, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.EditorFor(i => item.DepartmentId, new { htmlAttributes = new { @class = "form-control" } }) 
     @Html.ValidationMessageFor(i => item.DepartmentId, "", new { @class = "text-danger" }) 
    </div> 
</div> 
     <div class="form-group"> 
      @Html.LabelFor(i => item.DepartmentName, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(i => item.DepartmentName, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(i => item.DepartmentName, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
     <div class="form-group"> 
      @Html.LabelFor(i => item.Address, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(i => item.Address, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(i => item.Address, "", new { @class = "text-danger" }) 
      </div> 
     </div> 
    } 
<div class="form-group"> 
    <div class="col-md-offset-2 col-md-10"> 
     <input type="submit" value="Edit" class="btn btn-default" /> 
    </div> 
</div> 
} 
<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

EmployeeViewModel

Antwort

0

Ihre Der aktuelle Code (in der Bearbeitungsansicht) erzeugt ein Eingabemarkup wie unten.

<input class="form-control text-box single-line" 
     id="item_DepartmentName" name="item.DepartmentName" type="text" value="SomeName" /> 

Siehe Name Attributwert. Es ist "item.DepartmentName". Ihr HttpPost-Aktionsmethodenparameter ist der EmployeeViewModel-Typ, der keine Eigenschaft mit diesem Name hat! Daher kann der Modellbinder die Formulardaten, die von Ihrem Formular mit diesem Namen ("item.DepartmentName") an alle Eigenschaften Ihres Methodenparameters gesendet wurden, nicht zuordnen.

Die Lösung besteht darin, das Name Attributfeld Ihres Eingabefeldes zu aktualisieren, damit es mit den Eigenschaftsnamen Ihres EmployeeViewModel übereinstimmt. Im Idealfall sollte Ihr Code ein Markup wie unten erzeugen.

<input name="DepartmentName" type="text" value="Some value" /> 

Sie können explcitily geben Sie das Attribut name ert, wenn die Helfer html aufrufen. Zum Beispiel mit dem Html.TextBoxFor Helfer

@Html.TextBoxFor(i => item.DepartmentName, 
           new { @class = "form-control", NAME = "DepartmentName" }) 

Nun, wenn Sie das Formular abgesendet haben, werden Modell Bindemittel der Lage sein, den Wert dieses Formularfeld auf die DepartmentName Eigenschaft Ihres EmployeeViewModel Objekt abzubilden.

+0

Shyju-danke für die Antwort. Ich bin aber immer noch verloren. Der Abteilungsname sieht gut aus für mich. Gibt es noch etwas, das mir fehlt? Muss ich es in "TextBoxFor" ändern, anders als "EditorFor", weil es eine andere Klasse (Abteilung) ist? –

+0

Wenn Sie einfach ein Eingabefeld für den Benutzer eingeben möchten, verwenden Sie die 'TextBoXFor'-Hilfsmethode. – Shyju

+0

Ich habe die Zeile in Html.TextBoxFor geändert (i => item.DepartmentName, neu {htmlAttributes = new {@class = "form-control"}}). Es zeigt immer noch Null an. Ist da noch etwas falsch? –