Usuário com melhor resposta
Enviar multiplos arquivos ASP.Net MVC?

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 noCount
doICollection
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; } }
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.
- Sugerido como Resposta Juliano Nunes Silva Oliveira quinta-feira, 12 de outubro de 2017 23:54
- Marcado como Resposta welington jrModerator segunda-feira, 23 de outubro de 2017 18:59
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.
- Sugerido como Resposta Juliano Nunes Silva Oliveira quinta-feira, 12 de outubro de 2017 23:54
- Marcado como Resposta welington jrModerator segunda-feira, 23 de outubro de 2017 18:59
-
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.