L'API Web classeur modèle ne fonctionne pas avec HttpPostedFileBase?
Tester l'API Web de téléchargement de fichiers, la simple vue du modèle comme ceci:
public class TestModel {
public string UserId {get;set;}
public HttpPostedFileBase ImageFile {get;set;}
}
Utilisés dans la méthode:
[HttpPost]
public void Create(TestModel model)
Lorsque je tente de poster un multipart/form-data codées à l'action, je reçois cette exception:
System.InvalidOperationException: No MediaTypeFormatter is available to read an object of type 'TestModel' from content with media type 'multipart/form-data'.
at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger)
at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger)
at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger)
at System.Web.Http.ModelBinding.FormatterParameterBinding.ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
at System.Web.Http.Controllers.HttpActionBinding.<>c__DisplayClass1.<ExecuteBindingAsync>b__0(HttpParameterBinding parameterBinder)
at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
at System.Threading.Tasks.TaskHelpers.IterateImpl(IEnumerator`1 enumerator, CancellationToken cancellationToken)
Cela fonctionne avec la valeur par défaut liant de modèle MVC, mais apparemment pas avec l'API Web. Trouvé quelques mentionne que vous ne pouvez pas utiliser un modèle d'affichage lors du téléchargement d'un fichier, et à juste séparer les données en deux appels. Cela ne fonctionne pas pour moi, car j'ai besoin d'autres champs d'être publié afin de faire réellement quelque chose avec le fichier téléchargé. Est-il un moyen pour accomplir cette?
Vous avez besoin d'écrire une coutume
MediaTypeFormatter
pour le faire fonctionner. Comme vous connu "multipart/form-data" n'est pas pris en charge hors de la boîte. Vous pouvez commencer iciOriginalL'auteur heyseuss | 2012-10-02
Vous devez vous connecter pour publier un commentaire.
Voir ma réponse originale à cette question
https://stackoverflow.com/a/12603828/1171321
Combiner ma méthode de mon blog et la TryValidateProperty() suggestion pour maintenir la validation du modèle d'annotations.
Edit:
Je suis allé de l'avant et a travaillé jusqu'à une amélioration du code pour mon code dans le billet de blog. Je vais poster ce code mis à jour sous peu. Voici un exemple simple qui valide chaque propriété et vous donne accès à un éventail de résultats. Juste un exemple d'une approche
OriginalL'auteur Particleman
Vous pouvez soit écrire une coutume
MediaTypeFormatter
pour faciliter votre scénario ou vous pouvez récupérer les données de la requête à la main à l'aide deMultipartFormDataStreamProvider.FormData.AllKeys
collection. De cette façon, vous pouvez afficher à la fois les fichier(s) et d'autres champs dans une requête.Un bon tutoriel par Mike Wasson est disponible ici: http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-partie-2
OriginalL'auteur Filip W