2017-08-08 1 views
0

Ceci est mon modèle Voir.Comment ne pas avoir un élément nul dans une collection en .net mvc avec l'entrée html 5 avec l'attribut "multiple"

Public Class SomeClass 
    Public Property Attachments As IEnumerable(Of System.Web.HttpPostedFileBase) 
    'other stuff 
    'other stuff 
End Class 

Et à mon avis:

@Html.TextBoxFor(Function(model) model.Attachments, New With {.type = "file", .multiple = True}) 

Lorsque je sélectionne au moins une image à télécharger puis tout fonctionne correctement. Cependant, lorsque je ne télécharge aucune image, la collection contient un élément mais cet élément est null. enter image description here

est-il un moyen pour moi de faire, où, quand il n'y a rien à télécharger juste retour d'une collection nulle ou une collection vide?

Répondre

1

L'élément unique contient une valeur nulle à l'intérieur de IEnumerable(Of HttpPostedFileBase) lorsque l'envoi de formulaire sans téléchargement de fichiers peut être retracé par les en-têtes de demande HTTP POST du navigateur, ce qui indique que ce comportement est inhérent.

Ceci est un exemple de requête POST pour une page contient l'entrée de fichiers avec de multiples téléchargement activé (certaines pièces non pertinentes retirées par souci de concision):

Hôte: "localhost: [port]"

utilisateur- Agent: "Mozilla/5.0 (Windows NT 6.1; rv: 54,0) Gecko/20100101 Firefox/54,0"

Accepter: « text/html, application/xhtml + xml, application/xml; q = 0,9, /; q = 0,8 "

Accept-Language: "en-US, en; q = 0.5"

Accept-Encoding: "gzip, dégonfler"

Content-Type: « multipart/form-data; limite = --------------------------- 17618158692582"

Referer: "http://localhost:[port]/Example/Upload"

Connection: « keep- vivant »

Et ce que je reçois dans la section paramètres (avis paramètre de nom de fichier vide en gras):

------------------ ----------- 17618158692582

Content-Disposition: données de formulaire; name = "Pièces jointes"; filename = ""

Content-Type: application/octet-stream

La valeur vide du paramètre filename devient raison pour laquelle IEnumerable(Of HttpPostedFileBase) contient un objet unique qui stocke Nothing (null) Valeur & Count résultat de la collection renvoie 1, même valeur que la propriété Request.Files.Count.

Voici les conditions d'essai:

Dim fileCount As Integer = model.Attachments.Count() 'returns 1 

Dim firstFile As HttpPostedFileBase = model.Attachments.First() 'returns Nothing 

Dim requestCount As Integer = Request.Files.Count 'returns 1 

Notez qu'il n'y a pas d'autre moyen de supprimer le paramètre filename sur la tête Content-Disposition (de sorte qu'il est impossible de vider HttpPostedFileBase collection sur le formulaire soumettre), mais vous pouvez vérifier si la collection état a Nothing valeur en utilisant model.Attachments.First, ou en utilisant pour-chaque boucle comme ceci:

If model.Attachments.Any() Then 
    For Each file As HttpPostedFileBase In model.Attachments 
     If file IsNot Nothing Then 
      ' do something 
     Else 
      ' other stuff 
     End If 
    Next 
End If 

Référence:

ASP.NET MVC – Multiple Files Upload Bug or by-design issue?