Sind wir nicht alle Welt Held?
ASP.NET MVC
HowTo: Bilder mit CKEditor und ASP.NET MVC hochladen
14. Jan
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!
ASP.NET: Eigenen RoleProvider schreiben
30. Dez
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
30. Dez
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.
More >
Linq to Entity – Many to Many Relationship Problem
26. Dez
Aktuell habe ich folgendes Problem.
Ich habe eine Tabelle Rollen und eine Tabelle Benutzer, beide stehen über eine dritte Tabelle in einer m:m-Beziehung. Per Linq-to-Entity, also über ein ADO.NET Modell hole ich mir die Daten. Jedoch kann ich keine Relationen speichern.
Aktuell bekomme ich die Fehlermeldung:
EntitySet 'UserInRole' kann nicht aktualisiert werden, denn es hat eine DefiningQuery, und im <ModificationFunctionMapping>-Element ist kein <InsertFunction>-Element zur Unterstützung des aktuellen Vorgangs vorhanden.
Eine Suche im Netz bring mich nicht wirklich weiter. Dort hieß es, ich soll für die m:m-Tabelle einen Primary-Key setzen. Habe ich über beide Felder getan, Ergebnis war das selbe.
Bei dem Beispiel kann ich es über den Role-Provider lösen, aber so richtig weiter bringt es mich dann an anderer Stelle nicht.
Ich werde weiter berichten.
ADO.NET: Feld ausschließen
18. Dez
Als ich den letzten Beitrag schrieb, viel mir ja ein, dass man nicht immer alle Spalten an das Modell übergeben möchte. Oder das es nur Readonly oder ähnliches ist.
Im Prinzip ist es auch einfach, wenn man weiß wie es geht. Der Designer in Visual Studio ist da meiner Meinung etwas umständlich in der Handhabung.
So möchte ich bei meinem letzten Modell die ID auf Readonly setzen, da dies in der Datenbank automatisch hochgezählt wird. Die ID daher manuell zu setzen würde keinen Sinn ergeben.

Dazu öffne ich das Modell im Visual Studio Designer und wähle oben die Tabelle aus. Unten wird mir nun das Fenster “Zuordnungsdetails” angezeigt (alternativ über Ansicht » Weitere Fenster). Hier wähle ich die Spalte durch anklicken aus, die ich bearbeiten möchte. Wichtig ist jetzt dass ich hier nicht das vordere MSSQL-Feld sondern den hinteren Bereich, also den C# Typen auswähle (siehe Markierung).

Im Eigenschaftsfenster könnt ihr nun die entsprechenden Werte ändern. In dem Fall setzen wir den Setter auf Private.

Wenn wir nun versuchen eine Id zu setzen, hagelt es Fehlermeldungen:
TestTable test = new TestTable(); test.Id = 3;
Fehlermeldung lautet:
Die Eigenschaft oder der Indexer "MvcApplication1.Models.TestTable.Id" kann in diesem Kontext nicht verwendet werden, da der set-Accessor nicht verfügbar ist.
Auf diesen Weg können wir auch noch andere Sachen ändern, z.B. den Getter verändern oder den Namen des Attributs ändern.
Ach sollte man ein Feld gar nicht im Modell haben wollen, so wählt man bei den Zuordnungdetails einfach “Löschen” aus.
![]()
Auf den Weg könnt ihr das Feld später auch wieder ins Modell reinholen.


Letze Wortmeldungen