ASP.NET MVC gab die Bindung des Dateimodells bekannt, wenn der Parameter Modell ist
Gibt es eine Möglichkeit, um hochgeladene Dateien (<input type="file" />
) zur Teilnahme an Modell-Bindung in ASP.NET MVC ohne manuell zu suchen, auf Antrag Kontext, in ein benutzerdefiniertes Modell-binder, und ohne die Schaffung einer separaten action-Methode die dauert nur eine gebucht-Datei als Eingabe?
Hätte ich gedacht, dass das funktionieren würde:
class MyModel {
public HttpPostedFileBase MyFile { get; set; }
public int? OtherProperty { get; set; }
}
<form enctype="multipart/form-data">
<input type="file" name="MyFile" />
<input type="text" name="OtherProperty" />
</form>
public ActionResult Create(MyModel myModel) { ... }
Aber angesichts der oben genannten Szenario, MyFile
ist auch nicht Teil des value-Anbieter-Werte in den binding-Kontext. (OtherProperty
ist, natürlich.) Aber es funktioniert, wenn ich dies tun:
public ActionResult Create(HttpPostedFileBase postedFile, ...) { ... }
Also, warum kein verbindliches auftreten, wenn der parameter ein Modell, und wie kann ich machen, damit es funktioniert? Ich habe kein problem mit einem custom-model-binder, aber wie kann ich dies in ein benutzerdefiniertes Modell-binder ohne Blick auf Request.Files["MyFile"]
?
Konsistenz, Verständlichkeit und Testbarkeit, ich möchte meinen code, um die automatische Bindung aller Eigenschaften, die auf einem Modell, einschließlich derjenigen, gebunden, hochgeladene Dateien ohne manuellen Abgleich der request-Kontext. Ich bin derzeit am testen von Modell-Bindung mit der Ansatz von Scott Hanselman schrieb über.
Oder werde ich über diese in die falsche Richtung? Wie würden Sie dies lösen? Oder ist dies nicht möglich, durch design durch die Geschichte der Trennung zwischen Anfrage.Form und Anforderung.Dateien?
InformationsquelleAutor der Frage bzlm | 2009-06-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es stellt sich heraus, der Grund ist, dass
ValueProviderDictionary
sieht nur inRequest.Form
RouteData
undRequest.QueryString
zum Auffüllen der Wert-provider Wörterbuch in der model-binding-Kontext. Es gibt also keine Möglichkeit für ein custom-Modell von binder zu ermöglichen, veröffentlichte Daten zur Teilnahme an Modell-Bindung-ohne Prüfung der files-Auflistung in den request-Kontext direkt. Dies ist die nächste Möglichkeit, die ich gefunden habe, die das gleiche erreichen:Solange
myModelFile
ist eigentlich der name derfile
input-Formularfeld, es gibt keine Notwendigkeit für irgendwelche custom Sachen.InformationsquelleAutor der Antwort bzlm
Andere Möglichkeit ist ein hidden-Feld mit dem gleichen Namen wie der Eingabe:
Den DefaultModelBinder wird dann ein Feld sehen, und erstellen Sie die richtige Mappe.
InformationsquelleAutor der Antwort Brian Chance
Haben Sie sich dieser Beitragdie er links von die, die Sie verknüpft (über ein weiteres...)?
Wenn nicht, sieht es ganz einfach. Dies ist das Modell, Sammelmappe, die er verwendet:
Er registriert Sie in
Global.asax.cs
wie folgt:und Beiträge mit einem Formular, das wie folgt aussieht:
Alle der code ist kopiert direkt von der blog-post...
InformationsquelleAutor der Antwort Tomas Lycken
Brauchen Sie nicht zu registrieren, eine benutzerdefinierte binder,
HttpPostedFileBase
registriert ist standardmäßig im Rahmen:Hilft es, ein Buch Lesen jeder einmal in eine Weile, anstatt sich ausschließlich auf blogs und web-Foren.
InformationsquelleAutor der Antwort DSO