2015-07-12 4 views
8

Ich versuche, eine Datei mit HTML FileUpload-Steuerelement in MVC hochzuladen. Ich möchte die Datei validieren, um nur bestimmte Erweiterungen zu akzeptieren. Ich habe versucht, das FileExtensions-Attribut des DataAnnotations-Namespace zu verwenden, aber es funktioniert nicht. Siehe Code unten -FileExtensions-Attribut von DataAnnotations funktioniert nicht in MVC

public class FileUploadModel 
    { 
     [Required, FileExtensions(Extensions = (".xlsx,.xls"), ErrorMessage = "Please select an Excel file.")] 
     public HttpPostedFileBase File { get; set; } 
    } 

In der Steuerung, ich schreibe den Code wie unten -

[HttpPost] 
     public ActionResult Index(FileUploadModel fileUploadModel) 
     { 
      if (ModelState.IsValid) 
       fileUploadModel.File.SaveAs(Path.Combine(Server.MapPath("~/UploadedFiles"), Path.GetFileName(fileUploadModel.File.FileName))); 

      return View(); 
     } 

In View, ich habe unten Code geschrieben -

@using (Html.BeginForm("Index", "FileParse", FormMethod.Post, new { enctype = "multipart/form-data"})) 
{ 
    @Html.Label("Upload Student Excel:") 
    <input type="file" name="file" id="file"/> 
    <input type="submit" value="Import"/> 
    @Html.ValidationMessageFor(m => m.File) 
} 

Wenn ich das laufen Anwendung und geben Sie eine ungültige Dateierweiterung, es zeigt mir nicht die Fehlermeldung. Ich bin mir der Lösung bewusst, ein benutzerdefiniertes Validierungsattribut zu schreiben, aber ich möchte kein benutzerdefiniertes Attribut verwenden. Bitte weisen Sie darauf hin, wo ich falsch liege.

+0

könnte hilfreich sein: http://stackoverflow.com/questions/14718425/cant-get-mvc-4-fileextensions-attribute-to-work-on-viewmodel-property – serhiyb

+0

@ serhiyb Danke für deine Antwort. Ich habe diese Lösung durchgemacht. Aber ich möchte kein benutzerdefiniertes Attribut verwenden, ich möchte ein Attribut verwenden, das bereits von .NET bereitgestellt wird. Mache ich etwas falsch oder gibt es ein Problem in Microsoft bereitgestellten Attribut? – DfrDkn

+0

Da das FileExtensions-Attribut in MVC5 funktioniert (gerade getestet), nehme ich an, dass es in niedrigeren Versionen ein Problem damit gibt. – serhiyb

Antwort

2

Das FileExtensions-Attribut weiß nicht, wie eine HttpPostedFileBase überprüft wird. Bitte versuchen Sie es unter

[FileExtensions(Extensions = "xlsx|xls", ErrorMessage = "Please select an Excel file.")] 
public string Attachment{ get; set; } 

In Ihrem Controller:

[HttpPost] 
    public ActionResult Index(HttpPostedFileBase Attachment) 
    { 
     if (ModelState.IsValid) 
     { 
      if (Attachment.ContentLength > 0) 
      { 
       string filePath = Path.Combine(HttpContext.Server.MapPath("/Content/Upload"), Path.GetFileName(Attachment.FileName)); 
       Attachment.SaveAs(filePath); 
      } 
     } 
     return RedirectToAction("Index_Ack"}); 
    } 
4

Ich hatte das gleiche Problem, und ich beschlossen, eine neue Validation zu schaffen.

So:

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
    public class FileExtensionsAttribute : ValidationAttribute 
    { 
     private List<string> AllowedExtensions { get; set; } 

     public FileExtensionsAttribute(string fileExtensions) 
     { 
      AllowedExtensions = fileExtensions.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); 
     } 

     public override bool IsValid(object value) 
     { 
      HttpPostedFileBase file = value as HttpPostedFileBase; 

      if (file != null) 
      { 
       var fileName = file.FileName; 

       return AllowedExtensions.Any(y => fileName.EndsWith(y)); 
      } 

      return true; 
     } 
    } 

nun gerade diese verwenden:

[FileExtensions("jpg,jpeg,png,gif", ErrorMessage = "Your error message.")] 
public HttpPostedFileBase Imagem { get; set; } 

Ich habe geholfen. Umarmungen!

2

Wie marai geantwortet hat, funktioniert das FileExtension-Attribut nur bei String-Eigenschaften.

In meinem Code verwende ich das Attribut wie folgt:

public class MyViewModel 
{ 
    [Required] 
    public HttpPostedFileWrapper PostedFile { get; set; } 

    [FileExtensions(Extensions = "zip,pdf")] 
    public string FileName 
    { 
     get 
     { 
      if (PostedFile != null) 
       return PostedFile.FileName; 
      else 
       return ""; 
     } 
    } 
} 

Dann in Server-Seite wird ModelState.IsValid falsch sein, wenn die PostedFile nicht die entensions hat, die Sie im Attribute angeben (.zip und .pdf in meinem Beispiel).

Hinweis: Wenn Sie den HTML.ValidationMessageFor Helfer werden mit der Fehlermeldung angezeigt, nachdem ein Postback (Die Dateierweiterung Attribut lässt sich aber nicht auf Client-Seite, nur Server-Seite), müssen Sie einen anderen Helfer für die FileName Eigenschaft angeben, um zu Anzeige der Verlängerung Fehlermeldung:

@Html.ValidationMessageFor(m => m.PostedFile) 
@Html.ValidationMessageFor(m => m.FileName) 
Verwandte Themen