Behålla position på scrollbars

Det jag sökte var att kunna behålla positionen på scrollbars efter postback, men bara på vissa knappar. I Asp.Net kan man ju använda SmartNavigation till detta men det fungerar bara i IE (när jag provade senast) och ger en del oväntade buggar som bieffekt. Sen finns det också MaintainScrollPositionOnPostback, som man kan lägga i @Page-direktivet men då sker ompositionering på alla länkar och knappar som utlöser postback. Ibland vill man bara att vissa typer av postningar ska göra det.

Lösningen som använder javascript och två gömda input-fält hittade jag i detta forumet skrivet av Fredrik Normén

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

<!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>Scrollbar position</title>
<script language="javascript">
function SetScrollerPosition()
{
if (document.getElementById("XPos").value != "")
{
var x = document.getElementById("XPos").value;
var y = document.getElementById("YPos").value;
window.scrollTo(x, y);
}

document.getElementById("XPos").value = "0";
document.getElementById("YPos").value = "0";
}

function GetScollerPosition()
{
var scrollX, scrollY;

if (document.all)
{
if (!document.documentElement.scrollLeft)
scrollX = document.body.scrollLeft;
else
scrollX = document.documentElement.scrollLeft;

if (!document.documentElement.scrollTop)
scrollY = document.body.scrollTop;
else
scrollY = document.documentElement.scrollTop;
}
else
{
scrollX = window.pageXOffset;
scrollY = window.pageYOffset;
}

document.getElementById("XPos").value = scrollX;
document.getElementById("YPos").value = scrollY;
}
</script>
</head>
<body onload="SetScrollerPosition();">
<form id="form1" runat="server">
<div>
<asp:GridView …>
<Columns>
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:LinkButton
OnClientClick="GetScollerPosition();"
ID="LinkButton1"
runat="server"
CommandName="Edit"
Text="Edit"></asp:LinkButton>
<asp:LinkButton
ID="LinkButton2"
runat="server"
CommandName="Select"
Text="Select"></asp:LinkButton>
<asp:LinkButton
ID="LinkButton3"
runat="server"
CommandName="Delete"
Text="Delete"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
<input type="hidden" id="XPos" runat="server" />
<input type="hidden" id="YPos" runat="server" />
</form>
</body>
</html>

Under mitt googlande efter detta hittade jag även ett annat intressanta demo på samma ämne. Detta rullar ner en div med overflow till nedersta positionen så fort man lägger till någon i den. Perfekt om man ska göra en AJAX-chatt eller liknande. Detta kommer jag igång att jag försökt lösa tidigare utan lycka.

By Jesper Lind

Lägg till appSettings värden

följande visar hur man kan lägga till appSettings till genom code behind.


Configuration config = ConfigurationSettings.OpenWebConfiguration("~");

AppSettingsSection appSettingsSection = config.AppSettings;

appSettingsSection.Settings["MinNyckel"] = "Värdet som ska sparas!";

config.Save();

By Jesper Lind

Transaktioner med Asp.net

Här kommer jag skriva lite om hur man genomför databas transaktioner i Asp.Net. Alltså så man kan välja att genomföra eller att avbryta en uppdateringen i databasen beroende på andra faktorer. Exemplen är för SQL Server.

SqlTransaction trans = null;
try
{
conn = new SqlConnection ( . . . );
conn.Open();
trans = conn.BeginTransaction();
cmd = new Command();
cmd.Connenction = conn;
cmd.Transaction = trans;
cmd.ExecuteNonQuery();

}
catch(Exception objException)
{
if(trans!=null)
trans.Rollback();
}
finally
{
if(conn!=null)
conn.Close();
}

Mer läsning
Läs en artikel om hur man kan koppla en transaktion till en OleDbDataReader. http://www.c-sharpcorner.com/asp/Code/TransactionsInASPNETDPL.asp

By Jesper Lind

Ladda upp filer till server

Läs om hur man laddar upp bilder med FileUpLoad i Asp.Net C#.


<asp:Label id="lblMessage" runat="server">
<br />
<br />
<asp:FileUpLoad id="fuImage" runat="server" />

<asp:RegularExpressionValidator
id="fuValidator" runat="server"
ErrorMessage="Upload Jpegs and Gifs only."
ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.jpg|.JPG|.gif|.GIF)$"
ControlToValidate="fuImage">
</asp:RegularExpressionValidator>

<asp:Button id="buttonUpload" Text="Upload File" OnClick="buttonUpload_Click" runat="server" Width="105px" />

Lägg till följande funktion i klassfilen.

protected void buttonUpload_Click(object sender, EventArgs e)
{
if (fuImage.HasFile)
{

fuImage.SaveAs(@"C:\temp\" + fuImage.FileName);
lblMessage.Text = "Fil laddades upp: " + fuImage.FileName ;
}
else
{
lblMessage.Text = "Det fanns ingen fil i formuläret!";
}
}

Standarstorlek på uppladdning i FileUpload är 4MB. För att ändra på detta måste följande värde ändras i machine.config. Värdet anges i KB.

<httpRuntime maxRequestLength = "4096" />

Mer läsning
C-sharpcorner om FileUpload
Fredrik Normén - om hur man laddar upp flera filer åt gången
Artikel på aspnetresources.com om filuppladdning med exempel på hur man lägger till FileUpload kontroll genom javascript.

By Jesper Lind

Lägga till meta data i master page

Så här kan man göra för att dynamiskt lägga in metataggar i masterpages. Då får man en centraliserad plats för att t ex läsa in nyckelorden från en databas.

//Lägg till nyckeord
string strKeywords = "nyckelord1, nyckelord2";
HtmlMeta metaKeywords = new HtmlMeta();
metaKeywords.Name="keywords";
metaKeywords.Content=strKeywords;
Page.Header.Controls.Add(metaKeywords);

//Lägg till beskrivning
string strDescription = "En beskrivning till din webbplats";
HtmlMeta metaDescription = new HtmlMeta();
metaDescription.Name="description";
metaDescription.Content=strDescription;
Page.Header.Controls.Add(metaDescription);

//Skriv ut datum
HtmlMeta metaDate = new HtmlMeta();
metaDate.Name="date";
metaDate.Content=DateTime.Now.ToString("yyyy-MM-dd");
metaDate.Scheme = "YYYY-MM-DD";
Page.Header.Controls.Add(metaDate);

//Exempel för vertifikation för Google tjänster
//Skriv ut google verifikation
HtmlMeta metaVerify = new HtmlMeta();
metaVerify.Name="verify-v1";
metaVerify.Content="JhpBMxYdMJ8ywzA+n5+CCKm+i9SwRUK+hyoxL7tR1Ho=";
Page.Header.Controls.Add(metaVerify);

//Lägg till meta data för hur robotar ska uppföra sig, ändra till "noindex,nofollow" på de som inte ska scannas
string strRobots = "index,follow";
HtmlMeta metaRobots = new HtmlMeta();
metaRobots.Name="robots";
metaRobots.Content=strRobots;
Page.Header.Controls.Add(metaRobots);

Uppdatering:
I exemplet ovan är själva datan hårdkodad. Tanken var att läsa värdena från en databas tabell. Ett annat sätt är att definiera dessa värden i web.sitemap filen. Här nedan är ett exempel för hur man kan läsa värdena.

Ett stort tack till Henrik Feldt på MGT Kompetens AB för bidraget med följande kodstycke.

SiteMapNode node = SiteMap.CurrentNode;
if (node != null)
{
System.Web.UI.Page page = sender as Page;
if (page != null)
{
HtmlMeta metatag;
if (!page.Header.ToString().Contains("name=\"description\""))
{
if (!String.IsNullOrEmpty(node.Description))
{
metatag = new HtmlMeta();
metatag.Name = "description";
metatag.Content = SiteMap.CurrentNode.Description;

page.Header.Controls.Add(metatag);
}
}
if (!page.Header.ToString().Contains("name=\"keywords\""))
{
string keywords = node["keywords"];
if (!String.IsNullOrEmpty(keywords))
{
metatag = new HtmlMeta();
metatag.Name = "keywords";
metatag.Content = keywords;

page.Header.Controls.Add(metatag);
}
}
}
}

By Jesper Lind

Spara variabler i HttpRequest

HttpContext.Current.Items är en av Asp.Net's mindre kända sätt att spara data på. Items är en kollektion av nyckelbaserade data där man kan spara vilken typ av obejkt som helst. Dessa lever sedan under den aktuella HttpRequesten. Perfekt om man vill kunna dela "globala" variabler mellan user controls.

//Spara variabel
string key = "theKey";
int intNumberToSave = 555;
HttpContext.Current.Items[key]=intNumberToSave;

//Hämta variabel
Response.Write("Nummer: " + (int)HttpContext.Current.Items[key]);

By Jesper Lind

Bestämma hur sessioner ska lagras

Html är ett envägsprotokoll och kan inte hålla reda på från vilken webbläsaren ett anrop kommit från. När man programmerar dynamiska webbplatser är det ofta av stor vikt att man vet vilken användare som surfar på sidan vid ett visst tillfälle. För att hålla reda på dessa sessioner, som de kallas, finns det tre sätt att använda sig av i Asp.Net:
  • In Process (InProc)
  • State Server
  • SQL Server

In Process är det snabbaste och innebär att sessionerna lagras i arbetsprocessen "aspnet_wp.exe". Det har sina nackdelar eftersom alla sessioner försvinner om man startar om applikationen.

SQL Server är den säkraste metoden men kräver att man har en licens för SQL Server.

Vid State Server lagras sessionerna i en speciell process dedikerad till endast detta. Processen heter "aspnet_state.exe" och "aspnet_wp.exe" kommunicerar sedan med denna för att hämta och spara sessionsobjekten. Detta är en något långsammare metod än "In Process" men har sina fördelar i och med att applikationen kan startas om utan att man förlorar sessionosbjekten. Passar även bra vid webbfarmar där många servrar kan dela på samma lagringsplats för sessionerna.

För att ställa in en applikation för "State Server" anger man följande i web.config filen.

. . . mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
cookieless="false"
timeout="20" />

Ska flera servrar dela på samma State Server så måste man fylla i serveradressen istället för 127.0.0.1. Se även till att servicen "ASP.NET State Service" är igång på servern och inställd på automatisk uppstart.

By Jesper Lind

Stänga ner en applikation för underhåll

Ibland vill man stänga ner en hel hemsida medans man gör underhåll på den. Oftast vill man ju att det ska synas en sida med ett meddelande för besökare, som förklarar varför uppehållet sker.

En lätt lösning finns i Asp.net 2.0 där man kan ladda upp en fil som heter app_offline.htm direkt i rootmappen. Då går det inte längre att gå in på några andra sidor i applikationen. IIS-servern måste fortfarande vara igång.

By Jesper Lind

Ange titeln på sida i .Net 2.0

Titlen sätts ju vanligtsvis statiskt i <head>-taggen i html. I asp.net 2.0 kan man enkelt ange denna dynamiskt genom kod. Väldigt smidigt om man har många sidor som skapas dynamiskt ur en databas.

Page.Title = "Sidans title";

Att ha en bra titel på sidan är väldigt viktigt speciellt ut SEO-synpunkt. Läs mer om detta på Carnaby-bloggen.

By Jesper Lind