71 Stimmen

Wie behält man den Wert des Feldes input type=file nach fehlgeschlagener Validierung in ASP.NET MVC?

Ich habe ein einfaches Formular in einer MVC-App, die ich erstellt habe. Es enthält ein Dateifeld, damit Benutzer ein Bild hochladen können. Es funktioniert alles großartig.

Das Problem ist, dass der Inhalt des Dateifelds verloren geht, wenn die Validierung des Formulars fehlschlägt (andere Felder bleiben ausgefüllt, danke HtmlHelpers!). Wie bleibt das Dateifeld nach einer fehlgeschlagenen Validierung ausgefüllt?

TIA!

1 Stimmen

Ich habe heute einen ganzen Tag mit diesem Problem verschwendet. Es ist 12 Jahre her und ich kann nicht glauben, dass es immer noch keine brauchbare, native Lösung für dieses Problem gibt. Ich verwende ASP.NET's HttpPostFileBase Klasse in meinem Modell für das Hochladen von Bildern aus einer Ansicht und es funktioniert alles sehr gut. Dann habe ich versucht, dieses sehr einfache, gemeinsame Szenario zu behandeln, wo die geposteten Daten Server-seitige Validierung und Boom fehlschlägt. Stundenlanges Herumfummeln mit versteckten Eingaben, Konvertierung von Streams in Byte-Arrays und base64-Strings und alles Mögliche. Komplette Zeitverschwendung.

0 Stimmen

@Philip Stratford, genau das gleiche Boot hier, wirklich frustriert zu haben verschwendet fast einen ganzen Tag auf so ein einfaches Problem, ich habe am Ende nur die Rückkehr des Modells mit der Datei in die Ansicht, ohne den Zugriff auf sie direkt, und die Einstellung einer gefälschten Label auf die Ansicht, als ob die Datei noch auf die Eingabe ausgewählt wurde

62voto

Alexander Prokofyev Punkte 32808

Die Browser sind wegen der Sicherheitsrisiken so konzipiert. Es ist unmöglich, den Wert des Dateieingabefelds im HTML-Quelltext oder per Javascript festzulegen. Andernfalls könnte ein bösartiges Skript eine private Datei stehlen, ohne dass der Benutzer dies bemerkt.

Es gibt eine interessante Information über das Thema.

1 Stimmen

Ja, ich verstehe den Grundsatz der Sicherheit. Ich wünschte nur, dass es für das von mir beschriebene Szenario möglich wäre, einfach weil die Benutzererfahrung dadurch beeinträchtigt wurde ;/.

11 Stimmen

Um Ihr UX-Problem zu beheben, müsste der Benutzer die Datei erneut auswählen: Sie können die Datei in einem temporären Zwischenspeicher auf der Serverseite speichern, wenn das Formular mit einer bestimmten Datei zum ersten Mal übermittelt wird. Wenn die Validierung fehlschlägt, zeigen Sie einfach den Dateinamen (oder ein Miniaturbild) an, um anzuzeigen, dass das Feld gesetzt ist. Sobald die Validierung erfolgreich war, holen Sie die Dateidaten aus Ihrem Cache.

8 Stimmen

@tsauerwen, nun, das besiegt den Zweck von MVCs zustandslosem Modell.

3voto

Michael Punkte 674

Soweit ich weiß, können Sie den Wert eines Eingabefeldes für eine HTML-Datei nicht festlegen. Ich würde vorschlagen, das Dateieingabefeld mit einem Etikett oder Textfeld zu verbinden.

Dann können Sie es mit dem Wert aus dem Dateieingabefeld ausfüllen, um es später erneut zu übermitteln.

0 Stimmen

Interessant... kennen Sie eine Website, die das auf diese Weise umgesetzt hat? Ich suche nach Beispielen... vielen Dank.

0 Stimmen

Gmail verwendet etwas Ähnliches für seine Anhänge. Sobald die Datei hochgeladen ist, wird sie zu Text. Dies geschieht jedoch asynchron mit AJAX.

2voto

Wenn die Datei nicht zu groß ist, können Sie sie mit base64 kodieren und als Wert für ein verstecktes Feld verwenden.

1voto

gokkor Punkte 779

Es gibt flashbasierte Dateiuploader. Versuchen Sie einen von ihnen. Einige von ihnen greifen sogar auf ein normales Dateieingabefeld zurück, wenn Flash und Java Script nicht unterstützt werden. Ich empfehle, nach jQuery-Plugins zu suchen.

1voto

AGuyCalledGerald Punkte 7434

Ich würde empfehlen, die Validierung vorher über Ajax durchzuführen und eine teilweise Aktualisierung der Seite vorzunehmen. In diesem Fall verlieren Sie die Datei nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X