none
Enviar multiplos arquivos ASP.Net MVC? RRS feed

  • Pergunta

  • Estou desenvolvendo um sistema e preciso enviar varias imagens. Para isso eu criei no meu model um ICollection<HttpPostedFileBase> para receber multiplos arquivos, e no HTML criei o binder @HTML.TextBoxFor(model => model.imagens). O problema é que sempre que faço o submit do formulário, mesmo eu não tendo selecionado nenhuma imagem aparece no Count do ICollection que possui uma imagem, e com isso não consigo verificar se o mesmo está vazio para retornar o erro que eh necessário escolher pelo menos uma imagem para envio.

    Como resolver esse problema ?

    Model

    [FileType("jpg,png,jpeg",ErrorMessage="Imagens permitidas: .jpg, .png, .jpeg")]
    public ICollection<HttpPostedFileBase> imagens                  { get; set; }

    HTML

    <div class="form-group">
                    <label for="@Html.IdFor(model => model.imagens)" class="col-md-12 control-label">Imagens (Max.10) <img src="~/Imagens/required.png" height="6" width="6" title="requerido"></label>
                    <div class="col-md-10">
                        @Html.TextBoxFor(model => model.imagens, new{
                                                                    Class = "form-control",
                                                                    placeholder = "Escolha as imagens",
                                                                    multiple = "multiple",
                                                                    type = "file"
                                                                    })
                        @Html.ValidationMessageFor(model => model.imagens)
                    </div>
                </div><!--/imagens-->

    FileTypeAttribute/ValidationAttribute

    //valida se esta vazio ou possui os arquivos permitidos
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    public class FileTypeAttribute : ValidationAttribute, IClientValidatable{
        private const string _DefaultErrorMessage = "Somente imagens permitidas: {0}";
        private ICollection<string> _ValidTypes { get; set; }
    
        public FileTypeAttribute(string validTypes)    {
            _ValidTypes = validTypes.Split(',');
            ErrorMessage = string.Format(_DefaultErrorMessage, string.Join(" or ", _ValidTypes));
        }
    
        protected override ValidationResult IsValid(object value, ValidationContext validationContext){
            ICollection<HttpPostedFileBase> files = value as ICollection<HttpPostedFileBase>;
    
            //mesmo sem selecionar imagem ele sempre conta 1
            Debug.WriteLine("ICollection Size: " + files.Count); 
    
            if (files != null) {
                foreach (HttpPostedFileBase file in files)            {
                    if (file != null && !_ValidTypes.Any(e => file.FileName.EndsWith(e)))                {
                        return new ValidationResult(ErrorMessageString);
                    }
                }
            }
            return ValidationResult.Success;
        }
    
        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context){
            var rule = new ModelClientValidationRule();
            rule.ValidationType = "file";
            rule.ErrorMessage = this.FormatErrorMessage(ErrorMessage);
            rule.ValidationParameters["fileextensions"] = string.Join(",", _ValidTypes);        
            yield return rule;
        }
    }


    quarta-feira, 11 de outubro de 2017 04:00

Respostas

  • Você está gerando o input type="file" usando @Html.TextBoxFor ?? Veja o HTML gerado na página e veja se isto está correto, pois a menos que tenha feito alguma extensão do Helper, você precisa gerar o input file com:

    <input type="file" name="file" />


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    quarta-feira, 11 de outubro de 2017 11:45

Todas as Respostas

  • Você está gerando o input type="file" usando @Html.TextBoxFor ?? Veja o HTML gerado na página e veja se isto está correto, pois a menos que tenha feito alguma extensão do Helper, você precisa gerar o input file com:

    <input type="file" name="file" />


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    quarta-feira, 11 de outubro de 2017 11:45
  • O problema foi resolvido? Caso sim, lembre-se de marcar a resposta como aceita.

    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    terça-feira, 17 de outubro de 2017 09:45