2016-04-27 2 views
0

Ich versuche, eine Dropdown-Liste zu erstellen, mit der Sie angeben können, für welches Unternehmen ein Mitarbeiter arbeitet. Unten ist mein EmployeeViewModel. CompanyId ist ein Datenbankfeld mit eingeschränktem Fremdschlüssel, das mit der Company-Tabelle verknüpft ist.Dropdown-Listenwert scheint es nicht in die Datenbank für MVC zu machen 5

public class EmployeeViewModel 
{ 
    public EmployeeViewModel() 
    { 

    } 

    public EmployeeViewModel(Employee Employee, string CompanyName) 
    { 
     Initialize(Employee, CompanyName); 
    } 

    public EmployeeViewModel(Employee Employee, CliFFEntities db) 
    { 
     Initialize(Employee, db.Companies.Find(Employee.CompanyId).Name); 
    } 

    private void Initialize(Employee employee, string CompanyName) 
    { 
     this.Id = employee.Id; 
     this.Name = employee.Name; 
     this.CompanyId = employee.CompanyId; 
     this.InternalId = employee.InternalId; 
     this.CompanyName = CompanyName; 
    } 


    public int Id { get; set; } 
    public string Name { get; set; } 
    public Nullable<int> InternalId { get; set; } 

    [Display(Name = "Company")] 
    public int CompanyId { get; set; } 

    public String CompanyName { get; set; } 

    //public List<Company> CompanyList { get; set; } 
    public IEnumerable<SelectListItem> CompanyList { get; set; } //to be set in controller on an as-needed basis 
} 

Relevante Teil der Mitarbeiter Controller:

// GET: Employees/Create 
    public ActionResult Create() 
    { 
     var evm = new EmployeeViewModel(); 
     evm.CompanyList = new SelectList(db.Companies, "Id", "Name"); 
     return View(evm); 
    } 

Relevante Teil meines erstellen Ansicht:

<div class="form-group"> 
     @Html.LabelFor(m => m.CompanyId) 
     <div class="col-md-10"> 
      @Html.DropDownListFor(m => m.CompanyId, Model.CompanyList) 
      @Html.ValidationMessageFor(m => m.CompanyId) 
     </div> 
    </div> 

Also alles, was scheint gut zu funktionieren. Wenn ich mir die Post-Daten anschaue, wird sogar die CompanyId auf den korrekten Wert gesetzt, der einer Firmen-ID in der Datenbank entspricht.

Wenn ich jedoch den Fremdschlüssel auf der Datenbankseite erzwinge, wird ein Fehler ausgegeben, weil diese CompanyId nicht in den Employee-Datensatz aufgenommen werden kann. Wenn ich die FK-Bedingung abstelle, erscheint die CompanyId einfach als 0.

Was gibt?

+1

können wir Ihre POST-Methode sehen? –

+0

Wie ordnen Sie Ihr Ansichtsmodell dem Datenmodell zu? Wie speichern Sie Ihr Datenmodell? Sie müssen Ihre POST-Methode zeigen –

+0

Danke, Steves. Anscheinend habe ich die POST-Methode nicht beachtet. Ich bin super neu bei MVC! Ich habe eine Antwort auf meine eigene Frage geschrieben. –

Antwort

0

Welp, sieht aus, als wäre ich so neu in MVC 5, dass ich nicht wusste, dass es so etwas wie eine Post-Methode gibt. Hier ist, was ich änderte es die EmployeeViewModel zurück zu Mitarbeiter zur Karte:

// POST: Employees/Create 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "Id,Name,CompanyId,InternalId")] EmployeeViewModel evm) 
    { 
     var employee = new Employee { Name = evm.Name, CompanyId = evm.CompanyId, InternalId = evm.InternalId }; 
     if (ModelState.IsValid) 
     { 
      db.Employees.Add(employee); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(employee); 
    } 
+0

Entfernen Sie das schreckliche 'BindAttribute' (Sie brauchen das nie, wenn Sie ein Ansichtsmodell verwenden). Und es muss "return View (evm)" sein, wenn "ModelState" nicht gültig ist. Und wenn Sie die Ansicht zurückgeschickt haben, müssen Sie die Eigenschaft 'SelectList' der Ansichtsmodelle neu zuweisen, sonst würden Sie eine Ausnahme auslösen. –

+0

Vielen Dank für das Feedback, @StephenMuecke. –

Verwandte Themen