2009-04-10 9 views
2

Ich habe eine MVC-App und ich möchte auf der Oberseite der Masterseite eine Reihe von zufälligen Bildern aus dem Ordner haben.MVC - Wie zufällige Bilder aus einem Ordner auf der Masterseite

Um dies zu tun, muss ich Code schreiben, aber nicht wo den Code schreiben? Es muss an einem Ort erfolgen.

Ich werde wahrscheinlich nur die Bilder am Anfang der Sitzung setzen , so dass sie vom Browser zwischengespeichert werden und die Leistung der Website zu verbessern.

Malcolm

Antwort

3

Caching ist Key

Wie die anderen gesagt haben, haben Sie das Caching verwenden, da Sie sich wiederholende Disk ausführen I/O auf Daten, die nicht oft ändern.

In meinem Beispiel wird ein List<T> der Bilddateipfade erstellt und zwischengespeichert, die Sie für jede weitere Anfrage benötigen. System.Web.Caching ist perfekt dafür, weil Sie ein CacheDependency Objekt direkt in Ihrem Bildverzeichnis erstellen können - wenn eine Datei geändert oder hinzugefügt wird, wird Ihr Cache automatisch ungültig gemacht. Es wird dann neu erstellt, wenn es das nächste Mal angefordert wird.

Vermeidung von Dubletten mit dem HashSet<T>

Ich wette, Sie wollen nicht zwei gleiche Bilder immer in der Kopfzeile zeigt nach oben!

Die Randomisierung mit Random.Next schließt zuvor erzeugte Duplikate nicht aus. Ich habe einen HashSet<T> als einzigartigen Zufallsgenerator des armen Mannes verwendet, da der HashSet<T> nur Ihnen erlaubt, einzigartige Werte hinzuzufügen.

Das Modell

Diese Operation sollte ein Teil Ihres Modells in MVC sein. Sie ändern es, um mit Ihren anderen Daten abrufenden Klassen zu gehen, wie Sie für richtig halten.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Web; 
using System.Web.Caching; 

public class RandomImage 
{ 
    public static string[] GetImages(string folder, int count) 
    { 
     HttpContext context = HttpContext.Current; 
     string virtualFolderPath = string.Format("/content/{0}/", folder); 
     string absoluteFolderPath = context.Server.MapPath(virtualFolderPath); 

     Cache cache = context.Cache; 
     var images = cache[folder + "_images"] as List<string>; 

     // cache string array if it does not exist 
     if (images == null) 
     { 
      var di = new DirectoryInfo(absoluteFolderPath); 
      images = (from fi in di.GetFiles() 
          where fi.Extension.ToLower() == ".jpg" || fi.Extension.ToLower() == ".gif" 
          select string.Format("{0}{1}", virtualFolderPath, fi.Name)) 
          .ToList(); 


      // create cach dependency on image randomFolderName 
      cache.Insert(folder + "_images", images, new CacheDependency(absoluteFolderPath)); 
     } 

     Random random = new Random(); 
     var imageSet = new HashSet<string>(); 
     if (count > images.Count()) 
     { 
      throw new ArgumentOutOfRangeException("count"); 
     } 

     while (imageSet.Count() < count) 
     { 
      //using an hashset will ensure a random set with unique values. 
      imageSet.Add(images[random.Next(count)]); 
     } 

     return imageSet.ToArray(); 
    } 
} 

Der Regler

Rufen Sie die Methode in der Controller so etwas wie ....

string[] images = Models.RandomImage.GetImages("myPictures", 4); 
2

schreibt eine Hilfsfunktion, die einen zufälligen Dateinamen aus einem Array von Dateinamen erhalten würde, die beim Start der Anwendung erzeugt wird.

+0

Eine Hilfsfunktion, die * N * zufälligen Dateinamen erhalten würde. Um Duplikate zu vermeiden;) –

2

Nun, die Bilder zu bekommen:

string[] get_images(string folder) { 
    string[] files = Directory.GetFiles(folder, "*.jpg"/* or whatever */); 
    List<string> rand = new List<string>(); 
    Random r = new Random(); 
    for (int i = 0; i < numImages; i++) { 
     rand.Add(Path.GetFileName(files[r.Next(files.Length-1)])); 
    } 
    return rand.ToArray(); 
} 

Und dann in der Master-Seite:

<% PrintImages(); %> 

Wo PrintImages() ist:

string[] img = get_images(Server.MapPath("~/Content/RandomImages")); 
foreach (string i in img) { Response.Write("<img src=\"/Content/RandomImages/"+i+"\" />"); } 

Das ist eine grobe Lösung und Caching wäre gut - das würde wirklich eine Festplatte verprügeln.

+0

Danke aber wo geht PrintImages() hin. Es gibt keinen Code für Site.Master ??? – Malcolm

+0

PrintImages geht in der Site.master FRONT Ende .. irgendwo innerhalb der html. Wir haben keinen CODE mehr im Codebehind. Es gibt keine Notwendigkeit (Danke, Gawd!). z.

Willkommen bei ASP.NET

Zufälliges Bild: <% PrintImages(); %>

Ende von doc .. usw. –

+0

Nein Nein, wo funktioniert die Methode PrintImages, der Code dafür ????? – Malcolm

0

Ich möchte sicherstellen, dass das einfache Lesen des Verzeichnisses jedes Mal und das Erzeugen der Dateinamen ein echter Flaschenhals ist, bevor ich etwas Komplizierteres tun würde. Es ist sicherlich weniger effizient, aber der Code ist wohl einfacher. Wenn es sich nicht um einen Engpass handelt, ist die Controller-Aktion, die für das Rendern der Ansicht zuständig ist, der richtige Ort für den Code. Beachten Sie, dass Sie das Ausgabe-Caching für die Aktion deaktivieren müssen (falls dies nicht bereits geschehen ist), wenn Sie das Bild jedes Mal ändern möchten.

Wenn es, dass die Dateinamen Lesen stellt sich heraus, und die Konstruktion der Links wirklich ein Engpass ist - kann es dauern viel weniger Zeit als die tatsächliche Datei zu lesen - und die Dateien in dem Verzeichnis kann sich ändern, während die Anwendung ausgeführt wird, dann eine Sammlung von ihnen zu konstruieren und sie in der Sitzung bei der Anmeldung zu speichern, ist ein vernünftiger Weg, damit umzugehen. Wenn die Anwendung auch für das Hochladen der Bilder zuständig ist (damit sie weiß, wann sie sich ändern), können Sie sie möglicherweise beim Start der Anwendung laden und in einer globalen Instanz speichern, die von der Anwendung aktualisiert wird, wie es Bilder sind hochgeladen (oder entfernt).

Sobald Sie Ihre Sammlung von Bildern haben (indem Sie jedes Mal von der Sitzung oder einer globalen Instanz lesen), verwenden Sie einen Zufallsgenerator, um das Bild auszuwählen, das Sie anzeigen möchten oder ein Set, das Sie drehen möchten Verwenden Sie etwas wie das jQuery Cycle-Plugin, übergeben Sie es (sie) an die Ansicht und lassen Sie es die Image-Tags rendern.

Verwandte Themen