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

1voto

Arfath Punkte 143

Ich bin nicht damit einverstanden, dass "unmöglich" als richtige Antwort markiert wird. Für den Fall, dass jemand noch auf der Suche nach einer Möglichkeit ist, hier ist die Arbeit rund um, die für mich gearbeitet. Ich verwende MVC5. Die Idee ist, eine Sitzungsvariable zu verwenden. Ich habe die Idee von ASP.Net-Formular .

Mein Model/ViewModel (nur relevante Eigenschaften):

public partial class emp_leaves
    {
        public string fileNameOrig { get; set; }
        public byte[] fileContent { get; set; }

        public HttpPostedFileBase uploadFile { get; set; }
    }

In meinem Controller (HttpPost): //Prüfen

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(emp_leaves emp_leaves)
{
    if (emp_leaves.uploadFile != null && emp_leaves.uploadFile.ContentLength>0 && !string.IsNullOrEmpty(emp_leaves.uploadFile.FileName))
    {
        emp_leaves.fileNameOrig = Path.GetFileName(emp_leaves.uploadFile.FileName);
        emp_leaves.fileContent = new byte[emp_leaves.uploadFile.ContentLength];
        emp_leaves.uploadFile.InputStream.Read(emp_leaves.fileContent, 0, emp_leaves.uploadFile.ContentLength);
        Session["emp_leaves.uploadFile"] = emp_leaves.uploadFile; //saving the file in session variable here
    }
    else if (Session["emp_leaves.uploadFile"] != null)
    {//if re-submitting after a failed validation you will reach here.
        emp_leaves.uploadFile = (HttpPostedFileBase)Session["emp_leaves.uploadFile"];
        if (emp_leaves.uploadFile != null && emp_leaves.uploadFile.ContentLength>0 && !string.IsNullOrEmpty(emp_leaves.uploadFile.FileName))
        {
            emp_leaves.fileNameOrig = Path.GetFileName(emp_leaves.uploadFile.FileName);
            emp_leaves.uploadFile.InputStream.Position = 0;
            emp_leaves.fileContent = new byte[emp_leaves.uploadFile.ContentLength];
            emp_leaves.uploadFile.InputStream.Read(emp_leaves.fileContent, 0, emp_leaves.uploadFile.ContentLength);    
        }
    }
//code to save follows here...
}

Schließlich innerhalb meiner Ansicht bearbeiten: hier, ich bin bedingt zeigen die Datei hochladen Kontrolle.

< script type = "text/javascript" >
  $("#removefile").on("click", function(e) {
    if (!confirm('Delete File?')) {
      e.preventDefault();
      return false;
    }
    $('#fileNameOrig').val('');
    //toggle visibility for concerned div
    $('#downloadlrfdiv').hide();
    $('#uploadlrfdiv').show();
    return false;
  }); <
/script>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
@model PPMSWEB.Models.emp_leaves @{ HttpPostedFileBase uploadFileSession = Session["emp_leaves.uploadFile"] == null ? null : (HttpPostedFileBase)Session["emp_leaves.uploadFile"]; } @using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data"
})) { @Html.AntiForgeryToken()
<div class="row">
  @*irrelevant content removed*@
  <div id="downloadlrfdiv" @((!String.IsNullOrEmpty(Model.fileNameOrig) && (Model.uploadFile==n ull || uploadFileSession !=null)) ? "" : "style=display:none;")>
    <label>Attachment</label>
    <span>
            <strong>
                <a id="downloadlrf" href="@(uploadFileSession != null? "" : Url.Action("DownloadLRF", "emp_leaves", new { empLeaveId = Model.ID }))" class="text-primary ui-button-text-icon-primary" title="Download attached file">
                    @Model.fileNameOrig
                </a>
            </strong>
            @if (isEditable && !Model.readonlyMode)
            {
                @Html.Raw("&nbsp");
                <a id="removefile" class="btn text-danger lead">
                    <strong title="Delete File" class="glyphicon glyphicon-minus-sign">  </strong>
                </a>
            }
            </span>
  </div>
  <div id="uploadlrfdiv" @(!(!String.IsNullOrEmpty(Model.fileNameOrig) && Model.uploadFile==n ull) && !Model.readonlyMode ? "" : "style=display:none;")>
    <label>Upload File</label> @Html.TextBoxFor(model => model.uploadFile, new { @type = "file", @class = "btn btn-default", @title = "Upload file (max 300 KB)" }) @Html.ValidationMessageFor(x => x.uploadFile)
  </div>
</div>
}

0voto

Agi Hammerthief Punkte 2023

Sie können den Wert eines Eingabefeldes für eine HTML-Datei nicht festlegen. Ersetzen Sie das Datei-Upload-Feld durch ein verborgenes Eingabefeld, wenn Sie das Formular nach der Validierung ausgeben.

Bei der Übermittlung füllen Sie das ausgeblendete Feld mit dem Wert aus dem Dateieingabefeld (der später erneut übermittelt werden soll). Denken Sie daran, dass entweder der Datei-Upload oder der Name des verborgenen Feldes gleichzeitig vorhanden sein muss (nicht beides):

Nota: Der folgende Code ist für Illustration/Erläuterung nur zu Zwecken. Ersetzen Sie ihn durch den Code, der der von Ihnen verwendeten Sprache entspricht.

<?php /* You may need to sanitize the value of $_POST['file_upload']; 
* this is just a start */
if(isset($_POST['file_upload']) && !empty($_POST['file_upload'])){ ?>
<input type="hidden" name="file_upload" value="<?php print($_POST['file_upload']); ?>" />
<?php } else { ?>
<input type="file" name="file_upload" />
<?php } ?>

0 Stimmen

"Denken Sie daran, dass entweder der Datei-Upload oder der Name des versteckten Feldes gleichzeitig vorhanden sein muss (nicht beides). Was aber, wenn der Benutzer nach der Validierung seine Meinung ändert und eine andere Datei auswählen möchte?

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