Wenn Sonderzeichen, die z.B. aus einem Silverlight-Control kommen, noch numerische HTML Entities haben, also sowas wie “ü”, kann man das mit folgender Funktion in echte ANSI Zeichen konvertieren:
Public Shared Function CleanNumericEntities(ByVal InText As String) As String
Return Regex.Replace(InText, "&#\d{3};", New MatchEvaluator(AddressOf ReplaceNumericHTML))
End Function
Private Shared Function ReplaceNumericHTML(ByVal Ma As Match) As String
Dim Val = Ma.Value.Substring(2, 3)
If IsNumeric(Val) Then Return Chr(Val)
Return "?"
End Function
6623a3df-4675-4bf0-9a83-bd457381146c|0|.0
Unter der Verwendung von CultureInfo kann man mit .Net ganz bequem Monats- oder Tagesnamen übersetzen:
Thread.CurrentThread.CurrentUICulture =
new CultureInfo("fr-FR");
foreach (String s in
CultureInfo.CurrentUICulture.DateTimeFormat.MonthNames)
Console.WriteLine(s);
Ich habe diesen Code hier gefunden
760ba754-acaa-495e-b841-885622481a15|0|.0
Für die Benutzung von SEO freundlichen URLs (Search Engine Optimisation) benutze ich das URL Rewriting Modul des IIS (-> http://www.iis.net/extensions/URLRewrite).
Wenn nun ein Datapager z.B. an ein Listview Control gebunden wird, benutzt dieser leider als Linkadresse nicht die “schöne” URL, sondern die aus dem Rewriting entstehende URL.
Man kann dem Datapager aber mit dieser Funktion die neuen (schönen) Links beibringen:
Private Sub FixPagerURLs(ByVal Pager As DataPager)
For Each Pag As DataPagerFieldItem In Pager.Controls
For Each Ctrl In Pag.Controls
If TypeOf Ctrl Is HyperLink Then
Dim Hyp As HyperLink = Ctrl
Dim Req = Hyp.NavigateUrl.Replace(Request.Path, "").Replace("?", "")
Dim Params = Req.Split("&")
Dim NewPage = (From item In Params Where item.StartsWith("page")).FirstOrDefault
Dim URL = Request.RawUrl
If URL.Contains("?") Then URL = URL.Substring(0, URL.IndexOf("?"))
If NewPage = "page=1" Then
Hyp.NavigateUrl = URL
Else
Hyp.NavigateUrl = String.Concat(URL, "?", NewPage)
End If
End If
Next
Next
End Sub
und den dann im DataBound Event des Listview aufrufen:
Die Idee dazu habe ich von dieser Webseite:
http://blog.anasghanem.com/post/Programmatically-Modifying-the-HyperLinks-in-the-DataPager-control.aspx
975765dc-a6ab-4772-9930-c07023197a08|0|.0
Wenn man in einem datengebundenen Control (Repeater, Datagrid, ...) einen Radiobutton benutzt, der einen Gruppennamen hat, also innerhalb des Controls immer nur ein Button angewählt sein soll, bekommt man das Problem, dass asp.net dem RadioButton einen eindeutigen Namen gibt.
Damit wird, wenn ich eine neue Radiobox anwähle, die alte nicht deselektiert.
Mit diesem kleinen jQuery Script kann man die Funktion per Javascript wieder "nachbauen":
<script language="javascript" type="text/javascript">
//<![CDATA[
jQuery(document).ready(function() {
jQuery(":radio").change(function() {
var sel = this.id;
jQuery(":radio").each(function() {
if (sel != this.id) {
jQuery(this).removeAttr("checked");
}
});
});
});
//]]>
</script>
ff116b1c-7f70-4912-ad24-7cf2d9ab3667|0|.0
Wwnn Silverlight einen Webservice über SSL benutzen soll, müssen dazu folgende 3 Dinge beachtet werden:
1) eine clientaccesspolicy.xmlim Webroot haben:
<?xml version="1.0" encoding="utf-8" ?>
2) eine crossdomain.xml im Webroot haben:
<?xml version="1.0"?>
3) im Silverlight:
ich benutze dazu meisst eine Statische Methode, die den Webservice erstellt, um die jeweilige URL vom System an die Umgebung anpassen zu können.
Public Shared Function GetWebservice() As BackendService.BackendServiceSoapClient
'--Detect Current URL
Dim Url As String = String.Format("{0}BackendService.asmx", Settings.RootURLAll)
Dim Binding As ServiceModel.BasicHttpBinding
If Settings.RootURLAll.IndexOf("https") > -1 Then
Binding = New ServiceModel.BasicHttpBinding(ServiceModel.BasicHttpSecurityMode.Transport) With {.MaxReceivedMessageSize = 5000 * 1024}
Else
Binding = New ServiceModel.BasicHttpBinding(ServiceModel.BasicHttpSecurityMode.None) With {.MaxReceivedMessageSize = 5000 * 1024}
End If
'--Create new Webservice Client
Dim Binding As New ServiceModel.BasicHttpBinding(ServiceModel.BasicHttpSecurityMode.Transport) With {.MaxReceivedMessageSize = 5000 * 1024}
Dim WS As New BackendService.BackendServiceSoapClient(Binding, New ServiceModel.EndpointAddress(Url))
Return WS
End Function
c2064139-ed45-4286-9fe1-e28306feee61|0|.0
Wenn man Daten über eine Webseite zu Excel exportieren will, geht das eigentlich ganz einfach, indem man eine HTML Seite ausgibt, die eine Tabelle enthält, und dann den Contentyp setzt.
Dazu kann man noch den Tabellenzellen bestimmte CSS Attribute mitgeben, so dass die dann von Excel auch passent erkannt werden.
Hier mal ein ganz grober Dummy, der aber das Vorgehen veranschaulicht:
Response.Clear()Response.ClearHeaders()Response.ContentEncoding = Encoding.DefaultResponse.Buffer = TrueResponse.ContentType = "application/vnd.ms-excel"Response.AddHeader("Content-Disposition", "inline; filename=Statistik.xls")Dim Out As New StringBuilderOut.Append("<html>")Out.Append("<style>")Out.Append("body,th,td{font-size:10px;font-family:arial;color:black;}")Out.Append("table{mso-displayed-decimal-separator:""\,"";mso-displayed-thousand-separator:""\."";}")Out.Append("td{padding-top:1px;padding-right:1px;padding-left:1px;mso-ignore:padding;color:black;font-size:10.0pt;font-weight:400;font-style:normal;text-decoration:none;font-family:Calibri,sans-serif;mso-font-charset:0;mso-number-format:General;text-align:left;vertical-align:top;mso-background-source:auto;mso-pattern:auto;white-space:normal;}")Out.Append(".th{background:#d8d8d8;font-size:10px;font-family:arial;color:black;mso-pattern:black none;}")Out.Append(".date{mso-number-format:""Short Date"";}")Out.Append("</style>")Out.Append("<body>")Out.Append("<table>")Out.Append("<tr>")Out.Append("<td class='.date' align='left'>7.4.2009</th>")Out.Append("</tr>")Out.Append("</table>")Out.Append("</body>")Out.Append("</html>")Response.Write(Out.ToString)Response.End()
Folgende Formatierungsmöglichkeiten hat man für mso-number-format:
"0" NO Decimals "0\.000" 3 Decimals "\#\,\#\#0\.000" Comma with 3 dec "mm\/dd\/yy" Date7 "mmmm\ d\,\ yyyy" Date9 "m\/d\/yy\ h\:mm\ AM\/PM" D -T AMPM "Short Date" 01/03/1998 "Medium Date" 01-mar-98 "d\-mmm\-yyyy" 01-mar-1998 "Short Time" 5:16 "Medium Time" 5:16 am "Long Time" 5:16:21:00 "Percent" Percent - two decimals "0%" Percent - no decimals "0\.E+00" Scientific Notation "\@" Text "\#\ ???\/???" Fractions - up to 3 digits (312/943) "\0022£\0022\#\,\#\#0\.00" £12.76 "\#\,\#\#0\.00_ \;\[Red\]\-\#\,\#\#0\.00\ " 2 decimals, negative numbers in red and signed (1.56 -1.56)
6113bb6c-9995-461c-b33f-3a6247497baf|1|5.0
Bei mir bringt der ASP.Net Development Server (der für die Entwicklung von Silverlight Anwendungen extrem praktisch ist) im Internet Explorer immer einen Fehler, dass die Seite nicht gefunden werden kann (URL: http://localhost:64720/Default.html). Die gleiche URL funktioniert jedoch im Firefox problemlos, und auch im IE funktioniert die URL, wenn man anstatt localhost die 127.0.0.1 benutzt.
Das Problem liegt ein einem Eintrag in der hosts Datei, der für IPV6 gilt, jedoch hört der DevServer nicht auf IPV6.
also: ab in die c:\Windows\System32\Drivers\etc\hosts und vor die "::1 localhost" eine "#".
Damit ist das Problem behoben :-)
Tipp: am einfachsten gehht das Ändern der hosts, wenn man die in einen anderen Ordner kopiert, ändert, und wieder zurückkopiert. Dann hat man nur einen UAC Dialog.
2b3c8a1b-fabd-4bc8-9047-294a4079702a|0|.0
Microsoft hat ein neues Intellisense File für JQuery herausgebracht, mit dem nun im VS2008 alle Parameter vom JQuery angezeigt werden:
http://blogs.msdn.com/webdevtools/default.aspx
d5c0d351-c9f0-4402-acf0-19f94a8a3346|0|.0
Mit dem .Net 3.5 SP1 ist eine neue sehr nützliche Funktion zum asp:ScriptManager hinzugekommen: Man kann nun automstisch die benötigten Javascript Dateien zusammenfügen lassen (incl. die für das Ajax Control Toolkit benötigten!)
Dazu müssen folgende Schritte durchgeführt werden:
- mit dem Script Reference Profiler auflisten, welche Dateien überhaupr benötigt werden:
- den Profiler von Codeplex herunterladen
- die DLL im Projekt als Referenz anlegen
- in der index.aspx ganz oben folgende Referenz einfügen:
<%@ Register Assembly="ScriptReferenceProfiler" Namespace="ScriptReferenceProfiler" TagPrefix="asp"
%>
- auf der Seite dann den Profiler anzeigen:
<asp:ScriptReferenceProfiler runat="server" />
- Nun können die benötigten Dateien zum asp:ScriptManager hinzugefügt werden:
<asp:ScriptManager ID="sm1" runat="server"
EnableScriptGlobalization="false"
EnableScriptLocalization="false"
LoadScriptsBeforeUI="false"
ScriptMode="Release" >
<CompositeScript ScriptMode="Release">
<Scripts>
<asp:ScriptReference name="MicrosoftAjax.js"/>
<asp:ScriptReference name="MicrosoftAjaxWebForms.js"/>
<asp:ScriptReference Path="~/Include/js/jquery-1.2.6.min.js" />
<asp:ScriptReference Path="~/Include/js/thickbox.31.de.js" />
<asp:ScriptReference Path="~/Include/js/jquery.tooltip.js" />
<asp:ScriptReference Path="~/Include/js/my.js" />
</Scripts>
</CompositeScript>
</asp:ScriptManager>
Damit werden alle benötigten Dateien "am Stück" geladen.
70aa8773-7702-4cb5-a089-8476b10a1247|0|.0
Der IIS 7 hat nun endlich ein schönes Rewrite Modul bekommen.
Nun ergibt sich aber das Problem, das sowohl beim Postback, als auch, was natürlich damit zusammenhängt, im Updatepanel jedesmal die falsche Zielurl benutzt wird.
Dies lässt sich so beheben:
1) eine neue form.browser im /App_Browsers anlegen, die so aussieht:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
adapterType="FormRewriterControlAdapter" />
</controlAdapters>
</browser>
</browsers>
2) eine FormRewriterControlAdapter.vb im Projekt hat, die so aussieht:
Imports Microsoft.VisualBasic
Public Class FormRewriterControlAdapter
Inherits System.Web.UI.Adapters.ControlAdapter
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
MyBase.Render(New RewriteFormHtmlTextWriter(writer))
End Sub
End Class
Public Class RewriteFormHtmlTextWriter
Inherits HtmlTextWriter
Sub New(ByVal writer As HtmlTextWriter)
MyBase.New(writer)
Me.InnerWriter = writer.InnerWriter
End Sub
Sub New(ByVal writer As System.IO.TextWriter)
MyBase.New(writer)
MyBase.InnerWriter = writer
End Sub
Public Overrides Sub WriteAttribute(ByVal name As String, ByVal value As String, ByVal fEncode As Boolean)
If (name = "action") Then
Dim Context As HttpContext = HttpContext.Current
If Context.Items("ActionAlreadyWritten") Is Nothing Then
value = Context.Request.RawUrl
Context.Items("ActionAlreadyWritten") = True
End If
End If
MyBase.WriteAttribute(name, value, fEncode)
End Sub
End Class
Ich habe diesen Tipp in Scott Gu’s Blog bei “Handling ASP-NET PostBacks with URL Redirecting” gefunden
9a50b074-9e9f-4d90-8d09-3a7526beb7e1|0|.0