Esiste un modo per ottenere i file registrati (<input type="file" />
) per partecipare al binding del modello in ASP.NET MVC senza esaminare manualmente il contesto della richiesta in un raccoglitore modello personalizzato e senza creare un metodo di azione separato che richiede solo un file inviato come input?ASP.NET MVC ha pubblicato il binding del modello di file quando il parametro è Modello
avrei pensato che questo dovrebbe funzionare:
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) { ... }
Ma data la situazione di cui sopra, MyFile
non è nemmeno parte dei valori del provider valore nel contesto vincolante. (OtherProperty
è, ovviamente.) Ma funziona se faccio questo:
public ActionResult Create(HttpPostedFileBase postedFile, ...) { ... }
Quindi, perché non si fa vincolante verifica quando il parametro è un modello, e come posso farlo funzionare? Non ho alcun problema con l'utilizzo di un raccoglitore modello personalizzato, ma come posso farlo in un raccoglitore modello personalizzato senza guardare a Request.Files["MyFile"]
?
Per coerenza, chiarezza e testabilità, mi piacerebbe che il mio codice fornisse il binding automatico di tutte le proprietà su un modello, comprese quelle legate ai file pubblicati, senza ispezionare manualmente il contesto della richiesta. Attualmente sto testando il binding del modello usando the approach Scott Hanselman wrote about.
Oppure sto andando su questo nel modo sbagliato? Come risolverebbe questo? O questo non è possibile in base alla progettazione a causa della cronologia della separazione tra Request.Form e Request.Files?
* Nota: * non trascurare l'attributo 'enctype' nel modulo. Deve essere specificato come '" multipart/form-data "'. Altrimenti, l'argomento 'HttpPostedFileBase' con il nome corrispondente come attributo' name' sul tag di input, rimarrà 'null' su POST. –
Ho usato lo stesso, ma ho ottenuto l'errore: - Impossibile associare più parametri, nel mio $ .ajax ho impostato: - tipo: 'POST', dataType: 'json', contentType: 'multipart/form-data' , dati: formData – ujjaval