Linq und string.Contains() – Problem

Ich hatte eine kleine Methode, um mir bestimmte Datensätze aus einer Datenbank zu holen. Dazu nutze ich Linq, da es schön einfach ist.

        public IEnumerable<Data> Search(string filter)
        {
            var dataSet = from data in this.bigDataSet
                          where data.Name.Contains(filter)
                          select data;

            return dataSet;
        }

Über die Variable „filter“ wollte ich die Daten eingrenzen. Allerdings sollte es auch möglich sein, sich alle Datensätze anzusehen. In der MSDN zu string.Contains() lautet es:

Rückgabewert
true, wenn der value-Parameter in dieser Zeichenfolge vorkommt oder value eine leere Zeichenfolge („“) ist, andernfalls false.

Heißt für mich, dass ich „filter“ leer lassen kann und so alle Datensätze bekomme. Funktionierte aber nicht. Ich vermute mal, es liegt daran, dass ich Linq-to-Ent verwende. Das Workaround funktioniert aber ganz gut:

        public IEnumerable<Data> Search(string filter)
        {
            var dataSet = from data in this.bigDataSet
                          where (!string.IsNullOrEmpty(filter) ? data.Name.Contains(filter) : true)
                          select data;

            return dataSet;
        }

Vielleicht hat ja jemand genauere Informationen, warum der erste Ansatz nicht funktioniert. Auf Anhieb habe ich nichts gefunden.

HowTo: Bilder mit CKEditor und ASP.NET MVC hochladen

Ich hatte gerade das Problem, dass ich mit dem WYSIWYG-Editor CKEditor Bilder hoch laden möchte, um sie direkt in meinen Text einzupflegen.
Dazu wird irgendwo im View der Editor definiert:

  <script type="text/javascript">
      window.onload = function() {
          CKEDITOR.replace('ckEditor', {
            skin: 'office2003',            
            filebrowserUploadUrl: '<%=Url.Action("UploadImage") %>'
      });
  };
  
</script>

Wichtig ist hier der Parameter „filebrowserUploadUrl“. Dies ist der Pfad, wohin das Bild beim Upload gesendet wird.
Im Controller wird das ganze nun verarbeitet:

        [AcceptVerbs(HttpVerbs.Post)]
        public string UploadImage()
        {
            // Datei speichern
            var identifier = Guid.NewGuid();
            string[] fileExt = Request.Files[0].FileName.Split('.');
            string safeFile = identifier + "." + fileExt[fileExt.Length - 1];
            Request.Files[0].SaveAs(Path.Combine(HostingEnvironment.MapPath("~/UploadedImages/"), safeFile));
            
            // Daten an CKEditor zurück geben
            string result = "<script type=\"text/javascript\">";
            result += "window.parent.CKEDITOR.tools.callFunction(" + Request.QueryString["CKEditorFuncNum"] + ", \"" +
                      Path.Combine(Url.Content("~/UploadedImages/"), safeFile) + "\",\"\");</script>";
            return result;
        }

Erst speicher ich das Bild irgendwo und gebe dann den Pfad per Javascript zurück. Da ich nur das JS ausführen lassen muss, gebe ich kein komplettes View zurück. Die Url wird dann korrekt an CKEditor übergeben (siehe Screenshots). Der letzte Parameter des callFunction()-Aufrufes kann für Fehlermeldungen genutzt werden, Bild zu groß o.ä.
Mich hat dieser kleine Aufruf bestimmt eine Stunde gekostet!

CKEditor - Datei auswählen, Hochladen CKEditor - Datei hochgeladen und Pfad übergeben

Linq: Group By mit mehren Werten

Um bei einer Seite auf alte News zu greifen zu können, wollte ich eine Liste wie hier im Blog anhand „Monat Jahr“ bekommen. Daher musste ich nach zwei Werten gruppieren, dies geht am einfachsten mit einem anonymen Wertetyp:

            var dateListe = from dateStamps in this.DataList
                             group dateStamps by
                                 new {dateStamps.PostedTime.Year, dateStamps.PostedTime.Month}
                             into g
                                 select new
                                           {
                                               Year = g.Key.Year,
                                               Month = g.Key.Month,
                                               Count = g.Count()
                                           };

Habe mir kurz als Debugmeldung einen String daraus gebastelt:

            foreach (var liste in linkListe)
            {
                ViewData["test"] += "Datum: " + liste.Month + " " + liste.Year + " Anzah: " + liste.Count + "<br />";
            }

Als Rückgabe erhaltet ihr eine Liste:

Datum: 1 2006 Anzah: 1
Datum: 3 2006 Anzah: 2

Damit kann man Arbeiten 🙂

ASP.NET: Eigenen RoleProvider schreiben

Da ich nun einen eigenen MembershipProvider nutze, möchte ich auch entsprechenden meinen RoleProvider anpassen.
Dies ist eigentlich ähnlich einfach, wie der MembershipProvider. Dazu wird eine eigene Klasse von System.Web.Security.RoleProvider abgeleitet. Auch könnt ihr hier wieder mit dem Überschreiben der Methode „Initialize()“ Werte aus der „web.config“ übergeben. Wo ihr die Daten ablegt, bleibt euch auch hier wieder überlassen.

Das Einbinden in die „web.config“ erfolgt über folgenden Eintrag:

    <roleManager enabled="true" defaultProvider="MyPersonalRoleProvider">
      <providers>
        <clear />
        <add name="MyPersonalRoleProvider" type="MyApp.PersonalRoleProvider" connectionStringName="MSPConnString" />
      </providers>
   </roleManager>

Wichtig ist die erste Zeile. Standardmäßig steht „enabled“ nämlich auf false!
Der RoleProvider ist nun fertig zum Einsatz! In eurem ASP.NET Projekt könnt ihr auf die Daten über die Standardmethoden wie etwa „Role.IsUserInRole()“ etc. zugreifen. Mehr dazu steht in der MSDN.

ASP.NET: Eigenen MembershipProvider schreiben

Manchmal kann es Sinn machen, nicht den standardmäßigen ASP.NET MembershipProvider zu nutzen. Daher möchte ich euch kurz erklären, wie ihr einen eigenen MembershipProvider schreiben könnt. Dabei ist es letztendlich euch überlassen, wo die Daten gespeichert sind.

Ich benutze bei einem Projekt etwa eine SQL-Datenbank und speicher bzw. lese die Daten per Stored-Procedures. Man könnte die Daten aber auch in einer XML-Datei speichern oder direkt hardcoded in der Klasse.
ASP.NET: Eigenen MembershipProvider schreiben weiterlesen