2016-07-15 7 views
-1

AKTUALISIERT: Die Idee ist einfach: Ich möchte ein Eingabefeld mit einem Standardwert für ImageTitle Feld meines Modells auffüllen. Der Wert kommt aus der Datenbank. Dieser Standardwert sollte der Dateiname sein (auch in db gespeichert). Der Benutzer hat die Möglichkeit, das Dokument so zu lassen, wie es ist, oder es zu ändern, bevor die Seite gesendet wird.ASP.NET MVC 5 Zuweisung von Eingabewert mit Javascript Ursache DbEntityValidationException

Ich habe eine Ansicht, die ein Formular mit HTML-Helfern wie @EditorFor rendert. Sobald die Seite geladen ist ($(document).ready()) habe ich versucht, JQuery zu verwenden, um den Wert eines editierbaren input mit der ID label-title zu setzen, aber es stellte sich heraus, dass, als ich die Seite posten ich eine Ausnahme bekam. Diese Ausnahme ist nicht vorhanden, wenn ich manuell einen Bildtitel in die Eingabe gebe.

Ich habe versucht, ImageTitle einen Wert in der GET-Bearbeitungsaktionsmethode zuzuweisen. myImage.ImageTitle = myImage.Filename

Wie bei JQuery wird die Eingabe ordnungsgemäß mit einem Wert ausgefüllt, aber beim POST der Seite tritt dieselbe Ausnahme auf. An exception of type 'System.InvalidOperationException' occurred in System.Web.Mvc.dll but was not handled in user code Additional information: There is no ViewData item of type 'IEnumerable' that has the key 'UseType'. Exception thrown: 'System.Data.Entity.Validation.DbEntityValidationException' in EntityFramework.dll Exception thrown: 'System.InvalidOperationException' in System.Web.Mvc.dll Diese Ausnahme scheint nichts mit meinem wirklichen Problem zu tun zu haben, da ich es nicht verstehe, wenn ich die einzelne Zeile myImage.ImageTitle = myImage.Filename lösche und die App-Funktion einwandfrei funktioniere.

Hier ist ein Code, den ich verwende.

@Html.EditorFor(model => model.ImageTitle, new { htmlAttributes = new { id = "label-title", @class = "form-control" } }) 

erzeugt dieser HTML

<input class="form-control text-box single-line valid" id="label-title" name="ImageTitle" value="benq160715074510.jpg" type="text"></input> 

Ich bekomme keinen Fehler, wenn ich manuell einen Wert für Bildtitel eingeben, aber alles habe ich versucht, entweder mit JQuery, Javascript oder einem Wert im Controller-Aktion zuweisen triggert eine Ausnahme.

Meine bearbeiten Methode ist ziemlich Standard

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include = "All my fields here including ImageTitle..")] TutoringImage tutoringImage) 
    { 
     if (ModelState.IsValid) 
     { 
      Db.Entry(Image).State = EntityState.Modified; 
      Db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(Image); 
    } 

Kann mir jemand helfen, dass man auf?

+2

Warum verwenden Sie Javascript? Legen Sie einfach den Wert von ImageTitle in der GET-Methode fest, bevor Sie das Modell an die Ansicht senden (d. H.e wie "@ ViewBag.currentFileName" und lösche den "ViewBag". Und das Erstellen ungültiger HTML. –

+0

Ich stimme @stephenmuecke zu. Sie benötigen dazu kein Javascript. Sie machen es schwieriger für Sie –

+0

Das ist eine gute Idee, nur versucht es, es scheint die gleiche Ausnahme auszulösen. Warum den Viewbag löschen? –

Antwort

1

Ich denke, Sie sollten nicht die Attr-Funktion in diesem Code $('#label-title').attr('value', imgTitle); verwenden.

Der richtige Weg zum Füllen eines Eingabewerts ist mit der Wertfunktion. $('#label-title').val(imgTitle);

+0

Ich habe es vorher versucht, aber als ich mir die HTML-Ausgabe anschaute, sah ich value = "". Nur mit .attr sehe ich in meinem html-Wertfeld den richtigen Wert und bleibe nicht leer. Danke für den Vorschlag! –

+0

@AlainPaquette, Dies ist korrekt (und Ihr Code erzeugt ungültiges HTML durch Hinzufügen von '$ ('# label-title'). Text (imgTitle);'). Aber von den Kommentaren in Ihrer Frage haben Sie weit mehr Probleme, dass nur dies. –

+0

Ja, ich weiß, das ist kein gültiger HTML-Code, aber ich spiele mit dem, was ich kann, um zu sehen, ob sich das Verhalten ändert. Ich werde das entfernen und meine Tests wiederholen, nur um zu sehen, ob sich etwas ändert. –

0

Hier ist die Lösung, die am Ende funktionierte.

Mein Formular rief eine Aktionsmethode namens Save() auf, in der ich ein neues TutoringImage-Objekt erstellte. Als ich den Wert für dieses erste Vorkommen des Objekts zugewiesen habe, funktionierte es. Bei der Weiterleitung an die Aktion Edit(int? id) konnte ich das Feld ImageTitle so belassen wie es ist oder es ohne Bug ändern, der Eintrag wurde korrekt in der db gespeichert.

Was ich vor, dass der Versuch war dieses Feld nach seiner Gründung zu füllen, zuerst mit Javascript auf dem Client und die in meinem Controller in der Edit(int? id) GET Aktion wie folgt aus:

 if (tutoringImage.ImageTitle == null) 
     { 
      var query = from db in Db.TutoringImage 
         where db.ImageID == tutoringImage.ImageID 
         select db; 
      foreach (TutoringImage image in query) 
      { 
       image.ImageTitle = tutoringImage.Filename; 
      } 
     } 
     try 
     { 
      if (ModelState.IsValid) 
      { 
       Db.Entry(tutoringImage).State = EntityState.Modified; 
       Db.SaveChanges(); 
      } 
     } 

Dies scheiterte schlecht und ich kann nicht erklären warum. Was funktionierte, war die Zuweisung des "Standard" -Werts, den ich bei der Objekterstellung und nicht nach ... wollte. Ich fügte einfach eine Codezeile in meine Objekterstellung in der Aktionsmethode ein, die auf das Drag & Drop-Formular folgte.

TutoringImage im = new TutoringImage 
       { 
        Filename = fileName, 
        // and so on 
        ImageTitle = file.FileName, 
       };