Laden...

Forenbeiträge von Robsta10 Ingesamt 69 Beiträge

26.09.2007 - 10:10 Uhr

Halt halt, ich möchte mich nicht mit fremden Federn schmücken 😉
Es steht in meinem Blogeintrag das die Grafik von Leon Andrianarivony erstellt wurde. Mein Fehler, hab das Copyright später in der Grafik entdeckt 😉

Wenn du möchtest kann ich dir mal ein paar Links hier reinstellen, wenn ich wieder Zuhause bin.

Wäre nett!

Nochmals vielen Dank für deine Hilfe. Hab dieses Problem auch in forums.asp.net direkt gepostet. - Ich werd das Posten dort wohl wirklich bleiben lassen, ich habe bisher noch nie vernünftige Fragen auf meine Antworten bekommen...

myCSharp ist dagegen echt eine super Community 👍

Achja, Peter ich hab natürlich deinen Lösungsansatz auch ausprobiert! Funktioniert super und ist viel eleganter! Ich werde in Zukunft diesen, "deinen" Weg bevorzugen.

LG,
Robert

26.09.2007 - 09:38 Uhr

Du sagst es, leider nicht!

Woher hattest du dann eigentlich die Informationen, um diese Grafik zu erstellen? Im Endeffekt läuft meine Frage darauf hinaus, wo man bessere bzw. vollständigere Dokumentation für ASP.NET findet. Gibt es ein Buch, welches du empfehlen kannst, gibt es vielleicht Online Ressourcen, die ich noch nicht entdeckt habe. Ich habe auch ganz generell auf msdn nach einem Leitfaden für die user control Entwicklung gesucht, wurde leider nicht fündig. Ob das jetzt an mir lag oder ob es einen solchen Leitfaden gar nicht gibt, kann ich nicht beurteilen. Alle von mir gefundenen Inhalte zu user controls waren leider sehr oberflächlich...

LG,
Robert

26.09.2007 - 08:35 Uhr

Danke Peter, ich werd es nochmal ausprobieren.

Deinen "Tipp nebenbei" kannte ich zuvor schon 😉 Kann wirklich sehr nützlich sein und ich hab diese Technik auch für das vorliegende Problem verwendet. Aber die Grafik des Page Lifecycle kann noch hilfreicher sein... man erhält dadurch den Überblick über alle Events und kann Page Lifecycle Probleme im Voraus aus dem Weg gehen.

Btw: Gibts eigentlich eine Grafik des Page Lifecycles auch von Microsoft? Die MSDN-Hilfe war mir echt nicht die erhoffte Hilfe. Ganz generell scheint mir die Dokumentation etwas dürftig.

LG,
Robert

25.09.2007 - 17:00 Uhr

Vielen Dank Peter!

Vor allem die Grafik finde ich toll!! Danke dafür, ich bin mir sicher, dass sie mir in Zukunft helfen wird.

Ich habe mein Problem inzwischen selber lösen können 🙂 Peter, ich werde deine Lösung aber trotzdem nochmal ausprobieren! Danke nochmal dafür.

Für all jene die es interessiert, hier nochmal der ausschlaggebende Code meiner eigenen Lösung. Für Anregungen und Kritik bin ich natürlich immer offen.

Default.aspx.cs

    protected void Page_Load(object sender, EventArgs e)
    {        
        NameValueCollection c = Request.Form;
        if (IsPostBack && Request.Form[Button1.UniqueID] != null) {
            UserCrl.NumChildControls = int.Parse(TextBox1.Text);
        }        
    }
    protected void Button1_Click(object sender, EventArgs e) {
        // Da wird nix mehr gemacht ;-)
    }

UC_A.ascx.cs

    protected void Page_Load(object sender, EventArgs e)
    {        
        if (IsPostBack) {
            if(ViewState["NumChildControls"] != null) {
                numChildControls = (int)ViewState["NumChildControls"];
            }
        }
        // Aufruf zum Erzeugen der user controls
        CreateUCBs();
    }

    protected override void OnPreRender(EventArgs e) {
        // Hier wird nix mehr aufgerufen ;-)
    }

    // Anstatt CreateChildControls
    private void CreateUCBs() {
        for (int i = 0; i < numChildControls; i++) {
            Control c = LoadControl("UC_B.ascx");
            c.ID = "UC_B" + i.ToString();
            PlaceHolder1.Controls.Add(c);
        }
    }
}

So, der übrige Code sollte gleich geblieben sein! In Worten, was hab ich anders gemacht: NumChildControls wird in Default.aspx.cs schon in Page_Load aufgerufen und zwar nur dann, wenn Button1 gedrückt wurde (Request.Form[Button1.UniqueID] != null). Da UC_A#Page_Load erst nach _Default#Page_Load aufgerufen wird, können die dynamischen User Controls schon dort erzeugt werden.

Danke nochmals Peter für die Hilfe, für weiter Anregungen sehr dankbar.

LG,
Robert

24.09.2007 - 15:21 Uhr

Hallo Leute?

Hat niemand ne Idee? Zugegeben, das sind meine ersten Gehversuche in Richtung user controls, aber ich komm jetzt schon 2 Tage lang nicht mehr weiter in dieser Sache. Wenn ich ganz dumme Anfängerfehler gemacht habe, dann bitte klärt mich auf.

Ich hoffe ich habe die Anforderung verständlich geschildert. Das von mir gepostete Codebeispiel ist ganz simpel...

Wenn mir noch jemand helfen möchte, bitte einfach das Codebeispiel ausprobieren. Hoffe, dass dann klarer ist, wo mein Problem liegt.

Bitte nochmals um Hilfe
Robert

24.09.2007 - 13:54 Uhr

Vielen Dank für die Antwort.

Wenn du per Button Klick dein UC_B erstellst, wird das Control einmal eingebunden und der Eventhandler einmal erstellt.
Wird jetzt auf UC_B der besagte Button geklickt, ist das Button Control und dessen Eventhandler nicht mehr vorhanden.

Du musst Controls und deren Eventhandler immer erstellen, ansonsten sind sie beim nächsten Seitenaufruf nicht mehr vorhanden.

Vielen Dank erstmal für dein Antwort Peter, aber das habe ich schon berücksichtigt.

Das Ganze ist gar nicht so einfach, vielleicht hilft das gesamte Beispiel als Code:

Die Default.aspx Seite:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Src="~/UC_A.ascx" TagName="UCA" TagPrefix="uc" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        &nbsp;<div>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:Button ID="Button1" runat="server" Text="Update" OnClick="Button1_Click" /></div>
            <uc:UCA runat="server" ID="UserCrl"/>
    </form>
</body>
</html>

Code Behind:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e) {
        UserCrl.NumChildControls = int.Parse(TextBox1.Text);
    }
}

UC_A.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UC_A.ascx.cs" Inherits="UC_A" %>
<%@ Reference Control="~/UC_B.ascx" %>
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>

Code Behind:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class UC_A : System.Web.UI.UserControl
{
    private int numChildControls;
    public int NumChildControls {
        set { 
            numChildControls = value;
            ViewState["NumChildControls"] = numChildControls;
        }
        get { return numChildControls; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack) {
            if(ViewState["NumChildControls"] != null) {
                numChildControls = (int)ViewState["NumChildControls"];
            }
        }
    }

    protected override void OnPreRender(EventArgs e) {
        CreateChildControls();
    }

    private void CreateChildControls() {
        for (int i = 0; i < numChildControls; i++) {
            Control c = LoadControl("UC_B.ascx");
            c.ID = "UC_B" + i.ToString();
            PlaceHolder1.Controls.Add(c);
        }
    }
}

UC_B.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="UC_B.ascx.cs" Inherits="UC_B" %>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />

Code Behind:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class UC_B : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e) {
        Label1.Text = "Dem Erleuchteten eine Gabe!";
    }
}

Tja, das ist natürlich nicht meine Applikation, aber im Grunde genommen spiegelt das Beispiel die Problematik wider. Man kann wunderbar UC_A updaten, mit einer Eingabe ins Textfeld kontrollieren wie viele UC_Bs innerhalb von UC_A erstellt werden, aber betätigt man einen Button eines UC_B so geschieht quasi nichts.

Verlegt man allerdings in UC_A den Aufruf von #CreateChildControl nach PageLoad und initialisiert numChildControls mit einer Zahl, dann funktionieren die Buttons von UC_B. Der Code dafür:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class UC_A : System.Web.UI.UserControl
{
    private int numChildControls = 3;
    public int NumChildControls {
        set { 
            numChildControls = value;
            ViewState["NumChildControls"] = numChildControls;
        }
        get { return numChildControls; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack) {
            if(ViewState["NumChildControls"] != null) {
                numChildControls = (int)ViewState["NumChildControls"];
            }
        }
        CreateChildControls();
    }

    protected override void OnPreRender(EventArgs e) {
        //CreateChildControls();
    }

    private void CreateChildControls() {
        for (int i = 0; i < numChildControls; i++) {
            Control c = LoadControl("UC_B.ascx");
            c.ID = "UC_B" + i.ToString();
            PlaceHolder1.Controls.Add(c);
        }
    }
}

Vielen Dank im Voraus
LG
Robert

24.09.2007 - 12:28 Uhr

Hallo!

Meine Applikation besteht aus einer simplen Page UC_Test. Die Page beinhaltet ein Eingabefeld USER_INPUT und einen Button BTNUpdate. Weiters findet sich in der Page ein user control namens UC_A. Es wird in UC_Test deklarativ eingebunden. UC_A setzt sich wiederum aus dynamisch generierten user controls des Type UC_B zusammen. Abhänging von der Eingabe in USER_INPUT soll beim Klicken von BTNUpdate das user control UC_A upgedated werden, d.h. es sollen UC_B controls dynamisch erzeugt werden.

UC_A besitzt eine property NumberOfUCB welche determiniert wieviele UC_B's erzeugt werden sollen. In BTNUpdate_Click wird diese Eigenschaft für UC_A gesetzt. Im PreRender Event von UC_A wird eine Methode namens CreateUCBs aufgerufen, die die UC_Bs erzeugt. Kann man sich jetzt natürlich fragen, warum wird diese Methode erst in PreRender aufgerufen. Würde man #CreateUCBs schon in UC_A#Page_Load aufrufen, so wäre die property NumberOfUCB noch nicht gesetzt, da der Event Handler von BTNUpdate in der Hauptseite erst später abgearbeitet wird. Auf jeden Fall werden auf diese Weise die UC_Bs in UC_A dynamisch erstellt. - UC_A wird also aktualisiert.

Aber UC_B enthält auch einen Button. Der dafür erstellte Event Handler wird aber nie erreicht. Allerdings ruft man #CreateUCBs testweise in UC_A#Page_Load auf, so funktionieren die Buttons der generierten UC_Bs. Leider funktioniert dann BTNUpdate nicht mehr...

Ich habe in den letzten zwei Tagen schon vieles probiert, leider hat kein Versuch gefruchtet. Wahrscheinlich hat es mit User Controls und dem Page Lifecycle zu tun. Ich frage mich, ob obiges Szenario überhaupt möglich ist. Btw: Habe auch schon daran gedacht, einen Update Button in UC_A einzubauen, allerdings benötige ich diesen nicht für jede Seite, wo ich UC_A einbinden will.

Bitte um Hilfe
Robert

20.06.2007 - 10:54 Uhr

Vielen Dank Leute! Jetzt ist mir die Sache klarer =)

20.06.2007 - 10:41 Uhr

Genau stimmt, das deckt sich auch damit, was ich rausgefunden habe. Jetzt meine konkrete Frage: Wie kann ich in der App herausfinden von wo sie gestartet wurde?

LG,
Robert

20.06.2007 - 10:24 Uhr

Hallo Leute!

Habe ein für mein Verständnis ziemlich komisches Verhalten der Klasse FileInfo entdeckt.

Ich bin davon ausgegangen, dass sich eine relative Pfadangabe im Konstruktor von FileInfo IMMER auf das Verzeichnis bezieht, von dem aus die App gestartet wurde.

Wenn die App also in C:\App liegt sollte ich doch mit new FileInfo(".\settings.xml") zur Datei C:\App\settings.xml gelangen. Allerdings wenn man ZUVOR zum Beispiel mittels eines FileChoosers eine andere Datei in einem anderen Verz. auswählt z.B.: C:\Temp\import.xml dann führt die new FileInfo(".\settings.xml") zu C:\Temp\settings.xml. Nun scheint das Ganze intern auf die Methode #GetCurrentDirectory der Klasse Directory zurückzugreifen. Und die ist distinkt zum Stammverz. der App.

Gibts irgendeinen eleganten Workaround?

[Edit] In besagtem Fall arbeite ich mit .Net 1.1

Danke im Voraus und lG

Robert

07.05.2007 - 14:06 Uhr

So, hab jetzt zumindest eine suboptimale Lösung.

Wie in diesem Thread schon gesagt wurde, muss man in den Projektoptionen das Dokumentationsfile angeben. Die Xml-Datei muss gleich benannt sein wie die Assembly Datei die sie beschreibt. Lautet die Assembly Datei Foo.dll muss die Dokumentationsdatei Foo.xml heißen. Damit die Kommentare dann aber im Intellisense auftauchen, muss man VS2003 neustarten. Erst dann werden die Informationen aus der generierten Dokumentationsdatei ausgelesen und von VS verwendet.

Auch Änderungen der Dokumentation werden erst nach einem Neustart von VS2003 aktualisiert.

Das sind zumindest meine Erfahrungen. Vielleicht ist jemandem eine Einstellung in VS2003 bekannt, die es ermöglicht Änderungen der Dokumentation gleich zur Laufzeit in Intellisense zu integrieren...

LG,
Robert

07.05.2007 - 12:15 Uhr

Vielen Dank. Hab in 'Configuration Properties' der Projektoptionen das Feld 'XML Documentation File' auf den Namen des Assemblys gesetzt. Anschließend die gesamte Solution noch mal compiliert. Leider blieb diese Maßnahme ohne Erfolg.

Im Build Ordner des Projeks konnte ich die XML Hilfedatei übrigens auch ausfindig machen. Generiert wurde sie also, leider aber nicht von anderen Projekten benutzt.

die Erstellung der Dokumentation aktivieren

Ist das ein separater Schritt?

07.05.2007 - 11:28 Uhr

Hallo Leute!

Ich habe brav die Methoden einer Helper-Klasse dukomentiert, und zwar so:

	
/// <summary>
/// Extracts a value out of a Xml document according to the given XPathExpression.
/// </summary>
/// <param name="nav">Enables to navigate through the document</param>
/// <param name="expr">XPath expression which defines the search condition</param>
/// <returns>A string</returns>
public static string GetValue(XPathNavigator nav, string expr) {...}

So, innerhalb des VS2003-Projekts indem sich die Klasse befindet, wird die Dokumentation der Methode auch angezeigt. In einem zweiten VS-Projekt derselben Solution findet das aber schon nicht mehr statt, wenn ich diese Methode verwende.

Hab auch schon gesucht, leider nix gefunden... und da ich leider sehr sporadisch C# programmiere, hab ich irgendwie keinen Dunst, warum das nicht funzt...

Hoffentlich war das jetzt verständlich...

Danke im Voraus,
Robert

27.11.2006 - 09:36 Uhr

Und funktioniert das jetzt aufgrund deiner Vorgehensweise?

27.11.2006 - 08:59 Uhr

@FlyAway

Tja, ich habe in meiner Applikation zumindest den Grund dafür gefunden, dass die Session verloren geht.

Und zwar wird wenn der Button - der letztendlich den Redirect auslöst - gedrückt wird, in einem Unterverzeichnis eine Datei erstellt. .Net glaubt nun, dass sich die Applikation geändert hat und kompiliert alles nochmal neu, die Session Variablen gehen natürlich verloren.

D.h. wenn eine Datei innerhalb des Applikationsverzeichnisbaums hinzukommt, wird zumindest ein Teil der App neu kompiliert, alle Sessions gehen dabei verloren.

Alles klar?

LG,
Robert

08.11.2006 - 15:10 Uhr

So, hab das Problem für meinen Fall gelöst.

In der web.config Datei habe ich mittels folgendem Code den Zugriff auf Seiten in einem gewissen Ordner beschränkt:


  <location path="~/Admin">
    <system.web>
      <roleManager enabled="true"/>
      <authorization>
        <allow users="mro"/>
        <deny users="*"/>        
      </authorization>
    </system.web>
  </location>

Mit dieser Konfiguration habe ich die SiteMap richtig eingestellt. Auf diese Weise kann man securityTrimming einschalten.


    <siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
      <providers>
        <add name="XmlSiteMapProvider"
          description="Default SiteMap provider."
          type="System.Web.XmlSiteMapProvider "
          siteMapFile="Web.sitemap"
          securityTrimmingEnabled="true" />
      </providers>
    </siteMap>

LG,
Robert

08.11.2006 - 13:55 Uhr

Danke Waschbecken.

Hatte gerade meinen Beitrag (#4) geschrieben, als ich deine Antwort bekommen habe.

Tja, was mach ich, wenn ich keine Rollen definiert habe, die Personalisierung quasi auf Benutzerebene durchführen möchte?

(Ich müsste dafür nämlich einen eigenen Roleprovider schreiben...)

LG,
Robert

08.11.2006 - 13:42 Uhr

Danke.

Würde das dann bedeuten, dass ich eine Hauptnavigation besitze, die dann je nach Zugehörigkeit eines Benutzers zu einer Rolle dynamisch mit Unter-Sitemaps erweitert wird?

Werden Knoten, die auf eine Unter-Sitemap verweisen, angezeigt oder nicht, wenn sie nicht der aktuellen Rollenzugehörigkeit entsprechen?

Was ist, wenn es keine Rollen in meiner App gibt?

LG,
Robert

08.11.2006 - 13:33 Uhr

Vielleicht habe ich die Frage nicht ganz verstanden.

Wenn du ein neues TemplateField erzeugst, musst du dann auch ein ItemTemplate(also die Checkbox)
setzen.

LG,
Robert

08.11.2006 - 13:25 Uhr

Hallo Leute!

Meine Website verwendet das Menu Navigation Web Control für die Navigation. Dem zugrunde liegt ein File namens web.sitemap. Nun existieren in meiner Applikation verschiedene Benutzer, die jeweils nur bestimmte Seiten sehen dürfen.

Ein ganz normaler Benutzer darf beispielsweise die Admin-Seiten nicht sehen. Ist ein solch normaler Benutzer also eingeloggt, sollen Admin-Seiten folglich gar nicht in der Navigation zu finden sein.

Wie kann ich abhängig vom eingeloggten Benutzer die Navigation personalisieren? Ich könnte mir schon die eine oder andere Lösung vorstellen, allerdings würde ich gerne wissen, wie man das in ASP.NET machen soll.

Danke im Voraus,
Robert

07.11.2006 - 11:24 Uhr

Hallo Leute!

Ich bin gerade dabei die ChangePassword-Methode meines eigenen Memebership-Providers zu schreiben.

Sollte eigentlich kein Problem sein. Dieses Methode will ich von einer Seite aus aufrufen. So zum Beispiel:


protected void BtnChangePwd_Click(object sender, EventArgs e) {
  Membership.ChangePassword("abc","123","123");
}

Membership.ChangePassword gibt es aber nicht. Das Ganze verwirrt mich insofern, als dass ich zum Beispiel auf meiner Login-Seite Membership.ValidateUser(...) aufrufen kann.

Warum funktioniert aber Membership.ChangePassword nicht?

LG,
Robert

02.11.2006 - 14:18 Uhr

"Validates a user name and password against credentials stored in the configuration file for an application"

Und genau das hab ich vorher in meiner Applikation gemacht, nämlich die Benutzer in der web.config gespeichert. Diesen Teil der Applikation habe ich von jemand anderem übernommen und darum dachte ich auch, dass man die Authentifizierung genau so macht. An die Klasse Membership habe ich gar nicht gedacht bzw. gar nicht gewusst, dass sie existiert.

Hätte ich mir früher angeschaut was FormsAuthentication.Authenticate macht, wäre ich unter Umständen früher drauf gekommen.

LG,
Robert

02.11.2006 - 14:03 Uhr

Danke, liebe Anke. Jetzt funktioniert's!

Echt super!

Danke nochmal.

Liebe Grüße,
Robert

02.11.2006 - 12:52 Uhr

Nach einigen Testläufen bin ich auf etwas Interessantes gestoßen.

Ich habe auf einer Seite das Login Control plaziert. In der web.config hab ich meinen Provider hinzugefügt. Nachdem die App gestartet ist und der Login Button betätigt worden ist, wird der Provider initialisiert. Startet man die App neu und betätigt wieder den Login Button, wird nicht mehr initalisiert. Scheinbar kommt also igrendein Caching Mechanismus zum Einsatz. Nach einem Rebuild der Website, wird beim ersten Start und ersten Betätigen des Login Buttons wieder neu initialisiert.

Die Initialisierung scheint u.a. nur mit diesem Login Control stattzufinden. Verwende ich meine eigene Login Seite, die letztlich FormsAuthentication.Authenticate(...) aufruft, passiert leider nichts dergleichen.

Muss ich jetzt dieses Login Control verwenden, um meinen Provider benutzen zu können?

LG,
Robert

02.11.2006 - 12:02 Uhr

Hab ich schon gemacht. Auch der Breakpoint in ValidateUser wird nicht erreicht.

Wann wird ein Provider eigentlich initialisiert? Immer wenn ich die Applikation via VS starte?

LG,
Robert

02.11.2006 - 09:33 Uhr

Ja sorry. Bitte nicht beleidigt sein. Der Betreff ist schon irreführend.

02.11.2006 - 09:17 Uhr

Dass das jetzt mit Oracle eigentlich nix zu tun hat, ist jedem klar. Hab ich was anderes behauptet? Ist ja auch egal.

Ja, ich hab das Ganze schon debuggt. Der Breakpoint in #Initialize wird nicht erreicht. Wie kann man den Provider eigentlich "benutzen"? Wenn man den Provider im web.config hinzufügt, als Standard setzt und dann FormsAuthentication.Authenticate(...) aufruft, wird ja wohl der Provider "benutzt", oder?

Leider hatte ich noch keine Zeit, das Ganze mit dem Login Control zu testen. Wenn ich es gemacht habe meld ich mich wieder.

Danke,
Robert

31.10.2006 - 16:32 Uhr

Hallo Leute!

Meine Website basiert auf einer Oracle Datenbank. Es bietet sich also an, diese Oracle Datenbank auch als Speicher für die Benutzerverwaltung meiner Website zu benutzen. Mittlerweile weiß ich, dass ich dazu von der Basisklasse MembershipProvider ableiten muss.

Die abstrakten Methoden habe ich zumindest überschrieben, die Implementierung dieser aber noch nicht in Angriff genommen. Zusätzlich habe ich #Initialize überschrieben.. Nach meinem Verständnis müsste diese Methode ganz zu Beginn einmal aufgerufen werden. Nun, das scheint aber nicht der Fall zu sein. Diese Methode wird in meine Applikation nie betreten. Irgendwas muss ich wohl falsch machen...

Ausschnitt aus der web.config:


<authentication mode="Forms" />      
    <membership defaultProvider="OracleMembershipProvider">
      <providers>
        <add name="OracleMembershipProvider" type="OracleMembershipProvider" />
      </providers>
    </membership>


Wie bringe ich meine Seite dazu, meinen eigenen MemebershipProvider zu verwenden?

EDIT: Ich verwende nicht das Login WebControl, sondern eigene Eingabefelder. Mit FormsAuthentication#Authenticate(name, password) kann man dann beispielsweise die Benutzerdaten überprüfen. Ich hoffe, man muss nicht das Login Control verwenden, damit der OracleMembershipProvider verwendet wird.

Liebe Grüße,
Robert

09.10.2006 - 13:42 Uhr

Hallo Kollegen!

Hab jetzt eigentlich eine Alternative gefunden, mit der ich zufrieden bin. Was ich nämlich bisher immer getan habe war ein Response.Redirect() auf die entsprechende Datei zu machen, wenn der User einen Button betätigt hat.

Nun mach ich das Ganze aber mithilfe von Response.TransmitFile(). Damit können sich die Dateien in irgendeinem Verzeichnis des Servers befinden. Das Ganze sieht im Wesentlichen so aus:


private void TransmitFile(string fileName, string filePath, string mimeType) {
Response.Clear();
Response.ContentType = mimeType;
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.TransmitFile(filePath);
Response.End();
}

Warum es bei mir überhaupt zu soviel Ärger gekommen ist, liegt wohl daran, dass ich die Grundfunktionalität nicht richtig implementiert habe. Trotzdem möchte ich davor warnen, Dateien innerhalb des Applikations-Verzeichnisses zu erstellen. Stichwort: dynamische Kompilierung.

LG und danke nochmal an alle die mir geholfen haben
Robert

09.10.2006 - 10:34 Uhr

Ich hab App_Data schon lange vergessen gg

Okay, die Anwendung wird auch nicht neu gestartet, was da genau vor sich geht weiß ich selber nicht, Tatsache ist aber, dass, wenn Dateien generiert werden, die Session des Benutzers zurückgesetzt wird. Das darf aber nicht sein. Und das ist eigentlich mein großes Problem.

Insgesamt führe ich das ganze Verhalten auf dynamic compilation von ASP.NET 2.0 zurück. Vielleicht lieg ich ja falsch, ich kann mir das aber nur so erklären.

Und schön langsam werd ich wahnsinnig. Tut mir echt Leid, aber ich hätte mir das nie so schwer vorgestellt. Ich hoff, dass wir noch zu einer Lösung kommen. Bis hierher ein großes Dankeschön schon mal.

LG,
Robert

09.10.2006 - 10:17 Uhr

Tja das habe ich ja eh versucht. Ich hab das gerade noch einmal ausprobiert.

Dateien werden in Downloads Folder erstellt. Der User hat Zugriff darauf. ABER: ASP.NET erkennt, dass neue Dateien hinzugekommen sind und kompiliert nochmal neu. D.h. auch die Session des aktuellen Users ist futsch. Echt frustrierend muss ich sagen.

09.10.2006 - 09:43 Uhr

Danke. Mein Benutzer ist authentifiziert, keine Sorge. Trotzdem hat er keinen Zugriff auf App_Data.

Ich hab da beim Suchen auch was gelesen, von wegen, dass App_Data das Verzeichnis für besonders geschützte Datenbanken sei... Tja.

Ich frag mich folgendes: Kann ich in meinen Stammverzeichnis nicht einfach ein Verzeichnis namens export_files anlegen und die Applikation so konfigurieren, dass sie, wenn da eine Datei reinkommt, nicht denkt, sie sei aktualisiert worden.

Oder ich könnte ja auch außerhalb der Applikation (z.B. C:\Temp) dafür hernehmen. Wie kann der Server bzw. die Apllikation aber darauf zugreifen. Sorry vl. ist das echt ne dumme Frage, aber ich ich kenn mich da null aus.

LG,
Robert

09.10.2006 - 09:33 Uhr

Wäre auch eine Möglichkeit. Danke dafür.

Vorerst würde ich aber gerne doch meinen Mechanismus so belassen wie er ist. Muss doch irgendwie möglich sein, oder?

LG Robert

09.10.2006 - 09:07 Uhr

Vielen Dank für die Antwort.

Leider hat man von außen auf App_Data keinen Zugriff (Access denied). D.h. ich kann zwar in diesen Ordner schreiben, aber meine Benutzer können die generierten Dateien nicht downloaden.

Es muss doch irgendwas anderes geben?!

LG,
Robert

06.10.2006 - 17:07 Uhr

Hallo Leute!

Meine Applikation generiert csv Dateien, die der User downloaden möchte. Wenn ich diese Dateien innerhalb des Applikations-Verzeichnisses erstelle, denkt ASP.NET, dass sich die Appliaktion verändert hat und wirft alle Session Variablen weg. Habe dann versucht meine csv Dateien in C:\Temp zu erstellen. Darauf hat man aber auch keinen Zugriff.

Wie wird sowas gemacht. Ein Verzeichnis anlegen, in dem die Applikation Dateien erstellt, welche über die Website zugänglich sind und ASP.NET nicht glaubt das die Applikation aktualisiert wurde.

Bitte um Hilfe!

Danke,
Robert

06.10.2006 - 16:22 Uhr

So liebe Leut!

Ich hab die Lösung meines Rätsels gefunden. Nachdem ihr diese Information nicht hattet, ist klar, dass mir niemand helfen konnte. Und zwar wird wenn der Button - der letztendlich den Redirect auslöst - gedrückt wird, in einem Unterverzeichnis eine Datei erstellt. .Net glaubt nun, dass sich die Applikation geändert hat und kompiliert alles nochmal neu, die Session Variablen gehen natürlich verloren.

LG,
Robert

06.10.2006 - 16:10 Uhr

Noch was: Wenn ich in Seite B Server.Transfer anstatt Response.Redirect verwende, bleiben die Session Variablen erhalten.

Irgendwelche Ideen?

LG

06.10.2006 - 14:49 Uhr

SelectStudies.aspx ist Seite A, Subjects.aspx ist Seite B, Default2.aspx ist Seite C

Seite A (#GetSelectedStudies gibt eine ArrayList zurück):


Session.Add("SelectedStudies", GetSelectedStudies());
Response.Redirect("~/Subjects.aspx");

Seite B:


ArrayList selectedStudies = (ArrayList)Session["SelectedStudies"];
...selectedStudies durchlaufen und GridViews erstellen
Response.Redirect("~/Default2.aspx");

selectedStudies wird wie gewünscht ausgelesen!

Seite C:


ArrayList al = (ArrayList)Session["SelectedStudies"];

al ist null!

Wenn ich zum Beispiel von Seite A direkt auf Seite C springe..., also so:


Session.Add("SelectedStudies", GetSelectedStudies());
Response.Redirect("~/Default2.aspx");

...dann kann "SelectedStudies" ausgelesen werden.

Es kann ja auch auf Seite B "SelectedStudies" ausgelesen werden. Und ich denk mir wenn "SelectedStudies" auf Seite B noch vorhanden ist, dann muss das ja auch noch auf Seite C der Fall sein. Falsch gedacht anscheinend!

Übrigens es findet auf Seite B auch kein Session.Abandon() statt, Session["SelectedStudies"] wird auch nicht überschrieben oder so.

Was ich dann noch versucht habe:
In Seite B:


Session.Add("Test", "Test");
Response.Redirect("~/Default2.aspx");

In Seite C:


string st = (String)Session["Test"];

st ist auch null.

LG 😦

06.10.2006 - 14:21 Uhr

Sorry!

Ja die beiden Seiten befinden sich in derselben Applikation. Das Komische ist ja, dass es nur von einer bestimmten Seite aus nicht funktioniert.

LG,
Robert

06.10.2006 - 13:54 Uhr

Hallo Leute!

Hab folgendes Problem:
Wenn ich eine von einer Seite A auf eine andere B mit dem Befehl Response.Redirect springe, kann ich in Seite B nicht mehr auf die in Seite A gesetzte Sessionvariable zugreifen.

Kennt jemand dieses Problem

LG,
Robert

04.10.2006 - 17:32 Uhr

Bin in dieser Sache nur ein wenig weitergekommen!

Bevor ich loslege, muss ich noch folgenden Sachverhalt präsentieren:
Es gibt in meinen GridViews eine Checkbox im Kopf der Tabelle, die, wenn sie gecheckt wird, alle anderen Checkboxes ebenfalls checkt. Das alles passiert client-seitig über eine entsprechende Javascript Funktion. Damit die CheckAll Checkbox alle anderen kennt, müssen mit dem Code

ClientScript.RegisterArrayDeclaration("CheckBoxIDs" + studyId,
                    String.Concat("'", chkBox.ClientID, "'"));

die ClientID der erzeugten Checkboxes am Client vorliegen.

Ich kann mit Sicherheit sagen, dass das Fragment chkBox.ClientID verursacht, dass der ViewState für die Checkboxes nicht mehr funktioniert. Sobald ich dieses Fragment durch chkBox.ID ersetze funktioniert der ViewState, aber das Javascript funktioniert nicht mehr.

Ziemlich unbefriedigend!

Hat jemand einen Hinweis? Wäre echt super!

Danke,
Robert

04.10.2006 - 13:23 Uhr

Danke für die Anwort.

Ich habs soeben ausprobiert. Es funktioniert leider nicht.

Das PlaceHolder Control, dass die GridViews beinhalten sollte, ist zu dieser Zeit schon leer. D.h. wird die onclick Methode des Buttons erreicht, stehen keine Contols mehr zur Verfügung.

@.Kai: Hast du derartiges schon mal ausprobiert?

LG,
Robert

04.10.2006 - 12:27 Uhr

Hallo Leute!

Habe folgende Situation: Erzeuge dynamisch GridViews. Deren erste Spalte beinhaltet ein TemplateField, welches wiederum Checkboxes beinhaltet.

Außerdem gibt es auf der Seite einen Button, der, wenn er gedrückt wurde, den Status (also checked oder unchecked) aller Checkboxen auslesen soll.

Da ich aber in #Page_Load die GridViews auch bei jedem Postback neu generieren muss (es handelt sich ja um dynamische Controls) werden natürlich auch die Checkboxes wieder neu initialisiert und verlieren somit ihren Status. In der Methode, die das click Event des besagten Buttons behandelt und erst nach #Page_Load aufgerufen wird, stehen natürlich nur noch die in #Page_Load neu generierten Checkboxes zur Verfügung.

Es muss doch möglich seine Checkboxes, die man dynamisch generiert hat, auch wieder auslesen zu können?!

Danke und lG,
Robert

02.10.2006 - 12:38 Uhr

Hallo Leute!

Mal so ne Frage. Schau mir gerade den OracleDataReader genauer an. Ist ja nicht schlecht, allerdings fehlt mir dabei Folgendes:
Kann ich die Werte eines Datensatzes auch über den Spaltennamen oder ähnlichem ansprechen, oder nur über einen Index?

Denn verändert sich die Abfrage, müssen beim Zugriff auch alle Indizes geändert werden, während ein Spaltenname gleich bleibt.

LG,
Robert

29.09.2006 - 11:50 Uhr

Hey danke Robert G!

Jetzt hab ich es geschnallt. War der richtige Schups von dir. Musste ja nur eine Reference zum Projekt hinzufügen und jetzt steht auch mir System.Data.OracleClient zur Verfügung.

Zu deiner Kritik an meiner Neugier:
Du magst schon recht haben, aber ich hab doch gesagt, dass ich womöglich total auf der falschen Fährte bin. Dass der Namespace System.Data.OracleClient bei mir nicht zur Verfügung stand, lag ja wohl daran, dass ich die Reference nicht hinzugefügt habe.

Achja, vielleicht hätte ich sagen sollen, dass ich ein ziemlicher Frischling bin, was .Net und so angeht. Aber auch ich, als solch ein absoluter Idiot, habe zuvor versucht auf andere Art und Weise herauszufinden, wie man nun das beschriebene Szenario angeht. Aber bei dem (teilweise) Dokumentationssauhaufen von MS... Tut mir leid, man gewöhnt sich sicher auch an diese Art der Hilfe, aber ich muss echt sagen, dass es etwas Besseres gibt.

Danke nochmal an alle, die versucht haben, mir zu helfen.

LG,
Robert

29.09.2006 - 11:00 Uhr

Bei mir aber nicht.

Vielleicht bin ich auf der total falschen Leitung.

Wäre hilfreich wenn du den Namespace posten könntest!

Also System.Data.OracleClient gibt es bei nicht!!!

29.09.2006 - 10:50 Uhr

Okay danke. So kann man sich täuschen 🤔

Dann ist also alles beim alten?

Wie komme ich an das Addon für diesen Namespace ran? Denn im Standard .Net Framework 2.0 scheint es ja nicht enthalten zu sein.

Danke,
Robert

29.09.2006 - 10:40 Uhr

Hallo Leute!

Nur grundsätzlich ein Frage. Ich bin gerade dabei eine Website mit ASP.NET 2.0 zu erstellen. Im Backend befinden sich die Daten in einer Oracle 10g Datenbank.

Da ich für Operationen im Backend keine SqlDataSources oder ähnliche WebControls als Datenbankzugang missbrauchen will, frage ich mich wie ich im .Net Framework 2.0 auf eine Oracle DB zugreife?!

Bei .Net Framework 1.1 gabs ja noch den namespace System.Data.OracleClient. Der wurde meines Wissens aber gestrichen. Was ist der Ersatz dafür. Oder besser gesagt, wie kann ich im .Net Framework 2.0 auf Oracle nativ zugreifen???

Danke,
Robert

28.09.2006 - 17:08 Uhr

Hallo Leute!

Kann man eigentlich HTML Tags wie <h1> usw. dynamisch im Code-Behind erzeugen.

Oder muss ich um Text anzuzeigen Controls verwenden wie Label, dem dann eine CssClass und dann mit Css formatieren?

Die HTML Tags sollen in Webcontrols wie PlaceHolder plaziert werden.

LG,
Robert

27.09.2006 - 15:35 Uhr

Hallo Leute!

Hab ein kleine Problem.

Und zwar erstelle ich dynamisch eine GridView. Jede Zeile dieser GridView sollte am Ende einen Button anbieten, der, wenn er gedrückt wird, etwas bestimmtes macht.

Den Button baue ich über ein TemplateField ein. Das sieht in #InstantiateIn des Templates ungefähr so aus:

  
case ListItemType.Item:
Button csv = new Button();
csv.ID = CSV_BUTTON_ID;
csv.Text = "CSV";
csv.Click += new EventHandler(this.Button_Click);
container.Controls.Add(csv);
break;

Leider wird Button_Click nicht aufgerufen. Sobald ich selbiges außerhalb eines GridViews versuche, funktioniert es.

Kurz und bündig: Ich möchte also für jede Zeile in einer GridView einen Button platzieren und auf das Click Event reagieren.

Ich hoffe irgendjemand kann mir helfen.

Danke Robert