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(" ");
<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>
}
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