ASP.NET / .NET / C# - Mike Unckel

ASP.NET: Einfache Log-Datei schreiben

Muss mal schnell was mitgeloggt werden, bietet sich z.B. der StreamWriter an.

using System.IO;
...
string fileName = String.Format("log-{0}.txt", DateTime.Now.ToString("yyyy-MM-dd"));
string dataRow = String.Format("{0}; {1}; {2}", DateTime.Now, var1, var2);

StreamWriter myFile = new StreamWriter(Server.MapPath("~/App_Data/" + fileName), true);
myFile.WriteLine(dataRow);
myFile.Close();

ASP.NET

November 2009 | Permalink | Feedback


ASP.NET: Twitter Feeds per XmlDataSource- und Repeater-Control in Websites einbinden

RSS- bzw. Atom-Feeds von Twitter, Blogs usw. lassen sich sehr einfach mit dem XmlDataSource-Control in die eigene Website einbinden. Dazu ist quasi keine einzige Zeile "richtiger" Code notwendig, sonder lediglich zwei ASP.NET-Controls.

Das Beispiel bezieht sich explizit auf einen Twitter Atom-Feed, lässt sich aber an jeden beliebigen anderen Feed anpassen. Wichtig: Immer genau die XML-Struktur des Feeds über die Quelltextansicht anschauen. Bei Twitter sieht das z.B. so aus:

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>Twitter / unckel</title>
    <link>http://twitter.com/unckel</link>
    <atom:link type="application/rss+xml" href="http://twitter.com/statuses/user_timeline/23050865.rss" rel="self"/>
    <description>Twitter updates from unckel designworks / unckel.</description>
    <language>en-us</language>
    <ttl>40</ttl>
  <item>
    <title>unckel: tweet tweet!</title>
    <description>unckel: tweet tweet!</description>
    <pubDate>Wed, 18 Nov 2009 07:45:26 +0000</pubDate>
    <guid>http://twitter.com/unckel/statuses/5821036943</guid>
    <link>http://twitter.com/unckel/statuses/5821036943</link>
  </item>
  <item>
    ... usw ...
  </item>
  </channel>
</rss>

Wichtig ist hier also der Inhalt der <items> und das wären insbesondere <title>, <pubDate> und <link>.

<asp:XmlDataSource ID="XmlDataSource1" runat="server" 
	DataFile="http://twitter.com/statuses/user_timeline/23050865.rss"
	XPath="rss/channel/item" EnableCaching="false" />

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="XmlDataSource1">
<ItemTemplate>
	<a href="<%# XPath("link") %>"><%# XPath("title") %></a><br />
	<%# XPath("pubDate") %><br />
	<hr />
</ItemTemplate>
</asp:Repeater>

Einfach! Oder?

ASP.NET

November 2009 | Permalink | Feedback


ASP.NET: Tipps zu Server.MapPath

 currDir = Server.MapPath(".");
 parentDir = Server.MapPath("..");
 rootDir = Server.MapPath("/");

Will man Server.MapPath in Klassen verwenden > dann:

  HttpContext.Current.Server.MapPath();

Quellen:
http://www.devx.com/vb2themax/Tip/18488
http://glengamoi.com/forums/p/3066/10836.aspx
http://msdn.microsoft.com/de-de/library/system.web.httpserverutility.mappath(VS.80).aspx

ASP.NET

Oktober 2009 | Permalink | Feedback


ASP.NET: Canonical-Link-Tag dynamisch anpassen und einfügen

Doppelte Inhalte mögen Suchmaschinen bekanntermaßen nicht. Doch meistens können Webseiten über http://domain.de und http://www.domain.de erreicht werden. Für die Suchmaschine sind das zwei unterschiedliche Dinge.

Ein recht einfacher Ansatz mit ASP.NET kann so aussehen:
// using System.Web.UI.HtmlControls;

HtmlLink canonicalLink = new HtmlLink();
canonicalLink.Attributes["rel"] = "canonical";
canonicalLink.Href = Request.Url.AbsoluteUri.Replace("www.", "");
Page.Header.Controls.Add(canonicalLink);

Das ganze kommt dann z.B. in den Event-Handler Page_Load (Master-Datei, Basisklasse, ...). Es wird dann im HTML-Head der Seite das entsprechende Tag erzeugt:
<link rel="canonical" href="http://domain.de/site.aspx" />

Über Request.Url.AbsoluteUri wird die aktuelle URL samt Host und Parametern ermittelt und per Replace("www.", "") einfach, sofern vorhanden, das "www." entfernt. Aber Vorsicht: Alle Fundstellen mit "www." werden entfernt! Also auch etwaige übergebenen Parameter > d.h bei Bedarf nachbessern.

Alternativ kann aber auch per 301-Redirect in der global.asax umgeleitet werden.
Das könnte dann wie folgt aussehen:

<%@ Application Language="C#" %>
<script runat="server">
void Application_BeginRequest(object sender, EventArgs e)
{
  string url = HttpContext.Current.Request.Url.ToString().ToLower();
  
  if (!url.StartsWith("http://domain.de"))
  {
    // alle auf .de leiten
    url = url.Replace("domain.net", "domain.de");
    url = url.Replace("domain.com", "domain.de");
  
    // "www." entfernen
    url = url.Replace("http://www.domain", "http://domain");

    // permanente (301) Umleitung
    HttpContext.Current.Response.Status = "301 Moved Permanently";
    HttpContext.Current.Response.AddHeader("Location", url);
  }
}
</script>

Hier wird jeden Anfrage geprüft und ggf. auf die bevorzugte Domain per 301 umgeleitet - sprich das "www." einfach entfernt.

ASP.NET

September 2009 | Permalink | Feedback


ASP.NET: Telefonliste mit Initiale per Repeater auflisten

Hier mal ein Quick 'n' Dirty-Ansatz einer Telefonliste mit Initalen. Wir schreiben einfach eine Methode SetInitial, übergeben den Nachnamen im Repeater per Eval und bekommen eine HTML-Tabellen-Zeile zurück.

.aspx
<asp:Repeater ID="Repeater1" runat="server">
  <HeaderTemplate>
    <table>
  </HeaderTemplate>
  <ItemTemplate>
    <%#SetInitial(Eval("Nachname").ToString())%>
    <tr>
      <td><a href="profil.aspx?ID=<%#Eval("ID")%>">
        <%#Eval("Nachname")%>, <%#Eval("Vorname")%></a></td>
      <td><%#Eval("Telefon")%></td>
      <td><%#Eval("EMail")%></td>
    </tr>
  </ItemTemplate>
  <FooterTemplate>
    </table>
  </FooterTemplate>
</asp:Repeater>
.aspx.cs
// C#
private char initialOld;

public string SetInitial(string lastName)
{
  char initial = Convert.ToChar(lastName.Substring(0, 1).ToUpper());

  if (initial == 'Ä') initial = 'A'; // Umlaute werden unter den
  if (initial == 'Ü') initial = 'U'; // dazugehörigen Vokaln gelisten
  if (initial == 'Ö') initial = 'O';

  if (initialOld != initial)
  {
    initialOld = initial;
    return string.Format(@"
     <tr>
       <td colspan=""3"">
         <span class=""initial""><br/>&nbsp;<br/>{0}</span>
         <a name=""i{1}""></a><span><a href=""#top"">zum Index</a></span>
         <hr />
       </td>
     </tr>", initial, initial);
  }
  else
  {
    return null;
  }
}

ASP.NET

August 2009 | Permalink | Feedback


C#: Fundstelle eines Suchbegriffs markieren

Hebt den Suchbegriff an der Funstelle hervor, ähnlich den Suchmaschinen. Die Anzahl der Zeichen vor und nach der Fundstelle kann angegeben werden.

Beispiel: Suche nach "nur" im Text "Ich bin nur ein kleiner Text."

Ergebnis (4 Zeichen vor und nach der Funsstelle): ...bin nur ein...

// C#
public static string MarkReference(string text, string search, int num)
{
    string referenceText = text.Trim();
    string searchWord = search.Trim();
    string moreLeftTag = "...", moreRightTag = "...";
    int searchWordStartPos = 
           referenceText.IndexOf(searchWord, StringComparison.CurrentCultureIgnoreCase);
    if (searchWordStartPos >= 0)
    {
        int referenceTextLength = referenceText.Length;
        int searchWordLength = searchWord.Length;
        int resultLeftLength = num, resultRightLength = num;
        int resultLeftStartPos = searchWordStartPos - resultLeftLength;
        int resultRightStartPos = searchWordStartPos + searchWordLength;

        if (resultLeftStartPos < 0)
        {
            resultLeftLength = resultLeftLength + resultLeftStartPos;
            resultLeftStartPos = 0;
            moreLeftTag = "";
         }

         if ((resultRightStartPos + resultRightLength) > referenceTextLength)
         {
             resultRightLength = referenceTextLength - resultRightStartPos;
             moreRightTag = "";
         }

         return String.Format("{0}{1}{2}{3}{4}",
                moreLeftTag,
                referenceText.Substring(resultLeftStartPos, resultLeftLength),
                referenceText.Substring(searchWordStartPos, searchWordLength),
                referenceText.Substring(resultRightStartPos, resultRightLength),
                moreRightTag);
    }
    else
    {
        return null; // gibt's nicht...
    }
}

ASP.NET

August 2009 | Permalink | Feedback


ASP.NET: TextBox JavaScript-OnClick-Ereignis hinzufügen (= Pseudo OnClientClick)

Leider gibt es bei TextBoxen kein OnClientClick-Ereignis, um z.B. bei Klick darauf den Inhalt zu entfernen.

protected void Page_Load(object sender, EventArgs e)
{
  TextBox1.Attributes.Add("onclick", "this.value='';");
}

Ein anderes Beispiel: Einen LinkButton "disablen" bei OnClick. (Gesehen bei http://www.dotnetsnippets.com)

protected void Page_Load(object sender, EventArgs e)
{
  LinkButton1.Attributes.Add("onclick", "this.disabled=true; this.onclick=function() { return false; }");
}

ASP.NET JavaScript

August 2009 | Permalink | Feedback


ASP.NET Daten (z.B. Datensatz-ID) einem Button per CommandArgument mitgeben

Hier im Beispiel: Übergabe der ID beim Klicken eines Buttons in einem Repeater:

<asp:Repeater ID="Repeater1" runat="server">
  <ItemTemplate>
    <%# Eval("Title")%>
    <asp:Button ID="Button1" runat="server" Text="löschen" 
      CommandArgument=′<%# Bind("ID")%>′ 
      OnCommand="Button1_Command" /><br />
  </ItemTemplate>
</asp:Repeater>

...

protected void Button1_Command( object sender, CommandEventArgs e )
{
  int delId = Convert.ToInt32(e.CommandArgument);
  ...
}

ASP.NET

Juli 2009 | Permalink | Feedback


ASP.NET: Aktueller Benutzer ermitteln

Kurz zusammengestellt:
//UserName
Label1.Text = Environment.UserName;

// Domain\UserName
Label1.Text = Context.User.Identity.Name;
Label1.Text = Request.LogonUserIdentity.Name;
Label1.Text = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

ASP.NET

Juni 2009 | Permalink | Feedback


ASP.NET: Mehrere Buttons / Formulare auf einer Seite

Hat man mehrere Buttons auf einer Seite, muss man explizit angeben, welcher Button beim bestätigen über die Tastatur (Enter), ausgelößt werden soll. Das liegt daran, daß nur ein form-Tag verwendet werden darf. Ein bestimmter Button kann z.B. im Form-Tag angegeben werden:

<form id="form1" runat="server" defaultbutton="Button2">

Bei mehreren Formularen dann einfach mit einem Panel umschließen:

<asp:Panel runat="server" ID="Panel1" DefaultButton="Button1">
  //...
  <asp:Button ID="Button1" runat="server"
    Text="Button1" onclick="Button1_Click" />
  //...
</asp:Panel>

<asp:Panel runat="server" ID="Panel2" DefaultButton="Button2">
  //...
  <asp:Button ID="Button2" runat="server" 
    Text="Button 2" onclick="Button2_Click" />
  //...
</asp:Panel>
http://www.beansoftware.com/asp.net-tutorials/accept-enter-key.aspx

ASP.NET

Mai 2009 | Permalink | Feedback


ASP.NET: Verzeichnisschutz mit ASP.NET FormsAuthentication

Hier mal eine Copy'n'Paste-Vorlage: Auf alle Inhalte eines Verzeichnisses "CMS" kann nur bei erfolgreicher Anmeldung zugegriffen werden. Benutzername und MD5-kodiertes Passwort werden in der web.config hinterlegt.

root/web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="username" value="admin" />
    <add key="password" value="A13EE062EFF9D72..." />
  </appSettings>
  <connectionStrings />
  <system.web>
    <compilation debug="true" />
    <authentication mode="Forms">
      <forms cookieless="UseUri" defaultUrl="~/CMS/Default.aspx"
        loginUrl="~/Login.aspx">
      </forms>
    </authentication>
  </system.web>
  <location path="CMS">
    <system.web>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
  </location>
</configuration>

root/Login.aspx

<%@ Page Language="C#" AutoEventWireup="true" 
  CodeFile="Login.aspx.cs" Inherits="Login" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>Login</title>
</head>
<body>
  <form id="form1" runat="server">
    Username:
      <asp:Textbox id="TextboxUsername" runat="server" /><br />
    Password: 
      <asp:Textbox id="TextboxPassword" runat="server" 
      TextMode="Password" /><br />
    <asp:Button id="ButtonLogin" Text="Login" 
      OnClick="ButtonLogin_OnClick" runat="server" /><br />
    <asp:Label id="LabelInfo"  ForeColor="red" runat="server" />
  </form>
</body>
</html>

root/Login.aspx.cs

using System;
using System.Configuration;
using System.Web.Security;
using System.Text;
using System.Security.Cryptography;

public partial class Login : System.Web.UI.Page
{ 
  protected void Page_Load(object sender, EventArgs e) { } 
  
  // Login 
  protected void ButtonLogin_OnClick(object sender, EventArgs e)
  {
    // Username und Passwort von der web.config holen
    string username = ConfigurationManager.AppSettings["username"];
    string password = ConfigurationManager.AppSettings["password"];

    // Logincheck
    if ((TextboxUsername.Text.Trim() == username) &&
        (GetMd5Hash(TextboxPassword.Text.Trim()) == password))
    {
      FormsAuthentication.RedirectFromLoginPage(TextboxUsername.Text.Trim(), false); 
    }
    else
    {
      LabelInfo.Text = "Ungültige Anmeldung.";
    }
  }

  // MD5-Hash erzeugen zum Vergleich mit dem codierten Passwort
  private static string GetMd5Hash(string input)
  {
    MD5 md5Hasher = MD5.Create();
    byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
    StringBuilder sBuilder = new StringBuilder();
    for (int i = 0; i < data.Length; i++)
      sBuilder.Append(data[i].ToString("x2"));

    return sBuilder.ToString().ToUpper();
  }
}

root/CMS/Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" 
  CodeFile="Default.aspx.cs" Inherits="CMS_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>Geschützte Seite</title>
</head>
<body>
  <form id="form1" runat="server">
  <asp:LoginName ID="LoginName1" runat="server" FormatString ="Hallo {0}" />
  <asp:Button ID="Button1" runat="server" 
    Text="Logout" OnClick="Button1_Click" />
  </form>
</body>
</html>

root/CMS/Default.aspx.cs

using System;
using System.Web.Security;

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

  // Logout protected void Button1_Click(object sender, EventArgs e)
  {
    FormsAuthentication.SignOut();
    Response.Redirect("~/Login.aspx");
  }
}

Quellen:
BlaBlubBlog: Verzeichnisse per ASP.NET FormsAuthentication in 60 Sekunden schützen
.Net-Snippets.de: Erstellt einen md5-Hash aus einem string

ASP.NET

November 2008 | Permalink | Feedback


ASP.NET: DataFormatString in GridViews benutzen

HtmlEncode="False" nicht vergessen!
... HtmlEncode="False" DataFormatString="{0:h:mm}" ...

ASP.NET

Oktober 2008 | Permalink | Feedback


ASP.NET: SQL-Injection vermeiden

SQL-Injection lassen sich in ASP.NET sehr einfach vermeiden. Sowohl bei der Verwendung von WebControls als auch "von Hand".

Hier am Beispiel einer AccessDataSoucre mit einer Übergabe der ID in der URL (= GET):

<asp:AccessDataSource ID="AccessDataSource1" runat="server"
    SelectCommand="SELECT * FROM Tab1 WHERE ID = ?">
    <SelectParameters>
        <asp:QueryStringParameter Name="ID"
          QueryStringField="ID" Type="INT32" />
    </SelectParameters>
</asp:AccessDataSource>

Per Code (ohne DataSoucre-Controls) kann das so aussehen:


string sqlStr = "SELECT * FROM Tab WHERE CategoryID = ? AND Date = ?";
using (OleDbConnection conn = new OleDbConnection(...))
{
  using (OleDbCommand cmd = new OleDbCommand(sqlStr, conn))
  {
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue("CategoryID ", Request.QueryString["CatID"]);
    cmd.Parameters.AddWithValue("Date ", DateTime.Now.Year);
 
    conn.Open();
    using (OleDbDataReader reader = cmd.ExecuteReader())
    {
      while (reader.Read())
      {
        output = reader["Article"].ToString();
      }
    }
  }
}

via: mikesdotnetting.com. Da gibt's das auch noch für SQL-INSERT, -UPDATE, -DELETE und VB-Code:
http://www.mikesdotnetting.com/Article/26/Parameter-Queries-in-ASP.NET-with-MS-Access

Mehr zum Thema:
http://de.wikipedia.org/wiki/SQL_Injection

ASP.NET SQL

Oktober 2008 | Permalink | Feedback


ASP.NET: Von Pages auf Controls von Masterpages zugreifen

*.aspx

<%@ MasterType VirtualPath="~/Master1.master" %>

*.aspx.cs

Label lab = (Label)Master.FindControl("Label1");

Quelle: http://www.odetocode.com/articles/450.aspx

ASP.NET

September 2008 | Permalink | Feedback


ASP.NET: Homer-Ausnahme / Exception erzeugen

//C#
throw new InvalidOperationException("D'oh!");
;-)

ASP.NET

September 2008 | Permalink | Feedback


ASP.NET: Auf ConnectionStrings und AppSettings der web.config zugreifen

web.config:

<appSettings>
  <add key="copyright" value="(c) 2004"/>
</appSettings>
<connectionStrings>
  <add name="mainDB" connectionString="..." providerName="..." />
</connectionStrings>

*.aspx.cs

using System.Configuration;
//...
string appCopy = ConfigurationManager.AppSettings["copyright"];
string appConn = ConfigurationManager.ConnectionStrings["mainDB"];

*.aspx:

<asp:Label ID="Label1" runat="server" Text="<%$ AppSettings:copyright %>" />

Übersicht über ASP.NET-Ausdrücke:
http://msdn.microsoft.com/de-de/library/d5bd1tad(VS.80).aspx

ASP.NET

September 2008 | Permalink | Feedback


.NET 2.0: Verwenden von Regex .Replace

Kurz und schmerzlos: Ersetzen mit Reguläre Ausdrücke

using System.Text.RegularExpressions;
...
str = Regex.Replace(str, "Ä", "Ae");

ASP.NET

August 2008 | Permalink | Feedback


ASP.NET: Eine Liste von Strings an Controls binden

Daten, einer List lassen sich so z.B. an einen Repeater binden:

List<string> myValues = new List<string>();

...

Repeater1.DataSource = myValues;
Repeater1.DataBind();

...

<asp:repeater id="Repeater1" runat="server">
 <itemtemplate>
   <%# Container.DataItem %>
 </itemtemplate>
</asp:repeater>

Siehe: http://www.aspnetzone.de/blogs/peterbucher/archive/2008/06/29/eine-liste-von-strings-ohne-eigenschaften-an-ein-control-binden.aspx

ASP.NET

August 2008 | Permalink | Feedback


ASP.NET: Eigener Dateinamen ermitteln

Dateiname ohne Pfad der eigenen Datei?
// Dateinamen ohne Pfad und Parameter
Label1.Text = Request.Url.Segments[Request.Url.Segments.Length - 1];

//Nur Parameter
Label1.Text = Request.Url.Query

ASP.NET

Januar 2008 | Permalink | Feedback


ASP.NET: Wirklich löschen?-Bestätigung bei Buttons-Controls

Javascript-Bestätigung beim Löschen uws. beim Klick auf Button.
<asp:Button ID="Button1"
    runat="server"
    Text="Löschen"
    OnClick="Button1_Click"
    OnClientClick="if(!confirm('Wirklich löschen?')) return false;" />

ASP.NET JavaScript

Januar 2008 | Permalink | Feedback


ASP.NET: Einfaches URL-Rewriting mit der global.aspx

Über Application_BeginRequest in der global.asax können alle URL-Anfragen abgefangen und umgeformt werden. So kann man "schöne" bzw. lesbare URLs erzeugen. Also etwa statt domain.de/sportnews.aspx?id=12345 dann z.B. domain.de/usain-bolt-ist-der-schnellste.aspx.

Wie man nun die Verbindung zur ID herstellt ist ein anderes Thema. So könnte auch gleich die ID mitgeführt werden (usain-bolt-ist-der-schnellste-12345.aspx). Die Zahlen nach dem letzten Bindestrich sind also immer die ID. Oder man hat die URL mit der ID in einer DB-Tabelle und muss nur schnell die ID zur URL raussuchen.

global.asax

<@ Application Language="C#">
<script runat="server">
protected void Application_BeginRequest(object sender, EventArgs e)
{
  // Dateinamen lesen...
  string url = Request.Url.Segments[Request.Url.Segments.Length - 1];
  int id;

  // ... ID ermittlen, (hier ein Hard-Coding-Test) ...
  if (url == "usain-bolt-ist-der-schnellste") id = 12345;

  // ...und interne URL aufrufen
  Context.RewritePath(String.Format("sportnews.aspx?id={0}", id));

}
</script>

Mehr Infos:
URL Rewriting mit ASP.NET
Wie optimiere ich meine ASP.NET-Webseiten für Suchmaschinen?
Sinnvolle Verwendung der global.asax


Redirects per 404-Handler

Ein anderer Weg, der vor allem auch für nicht aspx-Ressourcen funktioniert, geht über einen 404-Handler. Dann könnte die URL so aussehen: domain.de/news/sport/usain-bolt-ist-der-schnellste oder auch domain.de/newid/12345 - wie also eine Verzeichnisstruktur.

Mehr Infos:
Creating your own URL Shrinker using ASP.Net
Workaround zum Thema mod_rewrite mit ASP...


URL-Remapping per web.config

Hat man eine überschaubare Anzahl von Seiten die umgeleitet werden sollen, kann dies "hardcoded" auch direkt in der web.config erfolgen:

<urlMappings enabled="true">
  <add url="~/sports.aspx" mappedUrl="~/news.aspx?category=sports" />
  <add url="~/world.aspx" mappedUrl="~/news.aspx?category=world" />
</urlMappings>

Mehr Infos:
http://msdn.microsoft.com/de-de/library/ms228302.aspx

ASP.NET

Dezember 2007 | Permalink | Feedback


ASP.NET: JavaScript MessageBox (alert) aufrufen

// JavaScript MessageBox (alert) aufrufen
public static void ShowAlert(string msg)
{
  string script = String.Format("Achtung: {0}", msg);

  Page page = HttpContext.Current.CurrentHandler as Page;
  page.ClientScript.RegisterStartupScript(typeof(Page), "alert", script);
}

ASP.NET JavaScript

November 2007 | Permalink | Feedback


ASP.NET: Excel-Tabelle in GridView anzeigen

Dieses kleine Code-Snippet in C# zeigt, wie mit ASP.NET 2.0 auf Exceldateien über OLEDB zugegriffen werden kann.

//using System.Data.OleDb;

using (OleDbConnection dbConn =
  new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;data source=" +
  Server.MapPath("~/Data/Mappe1.xls") + ";Extended Properties=Excel 8.0;"))
{
  dbConn.Open();
  OleDbCommand dbComm =
    new OleDbCommand("SELECT * FROM [Tabelle1$]", dbConn);
  
  using (OleDbDataReader dbRead = dbComm.ExecuteReader())
  {
    GridView1.DataSource = dbRead;
    GridView1.DataBind();
  }
}

ASP.NET Excel

September 2007 | Permalink | Feedback


ASP.NET, ASP und PHP: HTTP 301 Redirects

Mit diesen Scripts kann eine permanente Umleitung (HTTP Status 301) für Internetseiten eingerichtet werden.

Vorteile gegenüber einfachen Umleitungen (z.B. ASP Response.Redirect):

  • In Suchmaschinen werden die neuen URLs angepasst.
  • Die "Umleitungs-Seite" kann so irgendwann gelöscht werden.
  • Der PageRank wird auf die neue Website übernommen.
  • Diese Art der Umleitung wird nicht als Spam gewertet (als z.B. HTML META-Refreshes).

Einfach die einzelnen Seiten der Website mit folgendem Script (je nach Server) ersetzen.


ASP.NET 301 Redirect mit C#

<%@ Page Language="c#" AutoEventWireup="true"%>
<script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
  Response.Status = "301 Moved Permanently";
  Response.AddHeader("Location", "http://www.neue-adresse.com");
}
</script>


ASP 301 Redirect mit VBScript

<%@ Language=VBScript %>
<%
  Response.Status = "301 Moved Permanently"
  Response.AddHeader "Location","http://www.neue-adresse.com"
%>


PHP 301 Redirect

<?php
  Header("HTTP/1.1 301 Moved Permanently");
  Header("Location: http://www.neue-adresse.com");
?>


HTML per Meta-Refresh

Sollte kein Server-Side-Scripting (ASP, PHP, usw.) zu Verfügung stehen (z.B. bei Blog-Hostern), dann kann durchaus auch per HTML META-Refresh umgeleitet werden. So böse sind die wohl doch nicht mehr. Eine 0 oder 1-sekündige Umleitung wir als 301 (permanent), eine mehr als 1-sekündige als 302 (temporär) gewertet. Siehe: http://oyoy.eu/huh/redirects/

ASP.NET PHP

Juni 2007 | Permalink | Feedback