Mõnikord juhtub, et andmebaasis pikk päring ja vaja CommandTimeouti pikemaks panna, et veebiserver ära ei katkestaks, seda saab teha partial klassiga
PAST_DUE_ACCOUNTS_S on TableAdapteri klassi nimi millele tuleb uus klass lisada
public partial class PAST_DUE_ACCOUNTS_STableAdapter
{
public void SetCommandTimeout(int timeout)
{
foreach (IDbCommand command in CommandCollection)
command.CommandTimeout = timeout;
}
}
reede, 29. november 2013
kolmapäev, 4. september 2013
IIS8 kliendi sertfikaadiga veebilehe autentimine
Kui on veebirakendusel mõnele aspx lehele peale seatud Client Certificates - Require, ehk
lehele ligipääsuks tuleb ID-kaardiga autentida. Kui hakkab pilduma viga 403-Forbidden: Access is denied
Siis asja töölesaamiseks kontrolli ka, et IIS-i URL Authorization role komponent oleks installitud
lehele ligipääsuks tuleb ID-kaardiga autentida. Kui hakkab pilduma viga 403-Forbidden: Access is denied
Siis asja töölesaamiseks kontrolli ka, et IIS-i URL Authorization role komponent oleks installitud
esmaspäev, 2. september 2013
IIS8 tõstutundlikkus ehk Ambiguous match found
IIS8 peal selline asi enam läbi ei lähe
Veebirakendus on .NET. 4.0 tehtud ja veebilehel on kontroll ID-ga "LTA"
ja code-behindis on defineeritud muutuja
private decimal lta = 0.0M;
this.LTA.Text=String.Format("{0:F2}", this.lta);
ehk on nii lta kui LTA mille peale projekt VisualStudio2010 õnnelikult kompileerub, kuid kävitamisel veebilehe avamisel saab vea Ambiguous match found.
Lahenduseks see, et ühe muutuja nime tuleb muuta
Veebirakendus on .NET. 4.0 tehtud ja veebilehel on kontroll ID-ga "LTA"
<asp:Literal ID="LTA" runat="server" Text="0.0"></asp:Literal>
ja code-behindis on defineeritud muutuja
private decimal lta = 0.0M;
this.LTA.Text=String.Format("{0:F2}", this.lta);
ehk on nii lta kui LTA mille peale projekt VisualStudio2010 õnnelikult kompileerub, kuid kävitamisel veebilehe avamisel saab vea Ambiguous match found.
Lahenduseks see, et ühe muutuja nime tuleb muuta
<asp:Literal ID="LiTA" runat="server" Text="0.0"></asp:Literal>this.LiTA.Text=String.Format("{0:F2}", this.lta);
reede, 23. august 2013
Reavahetuse näitamine SQL SERVER andmeväljast asp:Label-is
Veebivormi kaudu tekstiboksi sisse reavahetusi sisestades võib tekkida soov pärast need reavahetused säilitada veebis taaskuvamisel
MS SQL SERVER säilitab andmeväljas reavahetusi kui CHAR(10) sümbolit (\n). Andmebaasi väljast saab reavahetust leida PATINDEX('%'+CHAR(10)+'%', ...) funktsiooni abil
SELECT [message_text]
,PATINDEX('%'+CHAR(10)+'%',message_text) AS esimene_reavahetus
FROM [dbo].[MESSAGES]
näiteks kasutab asp:Label mille paneb veel asp:Panel sisse kerimisribade pärast
Reeglina peaks töötama järgmine konstruktsioon
aga IIS6 miskipärast ei tööta. Üks mitte eriti ilus lahendus on see, et proovib erinevad variandid läbi. Sobib siis kui regulaaravaldsed pole just tugevaim külg.
Viisakas on muidugi väljund ennem AntiXSS teegi funktsioonist GetSafeHtmlFragment läbi lasta.
GetSafeHtmlFragment aga sööb reavahe <br /> märgendi ära.
Üle nurga lahendus võib olla selline, et pöörab reavahe mingiks vähetõenäolise stringijadaks. Näiteks "#####" ja peale GetSafeHtmlFragment funktsiooni asendab "#####" "<br />" märgendiga
MS SQL SERVER säilitab andmeväljas reavahetusi kui CHAR(10) sümbolit (\n). Andmebaasi väljast saab reavahetust leida PATINDEX('%'+CHAR(10)+'%', ...) funktsiooni abil
SELECT [message_text]
,PATINDEX('%'+CHAR(10)+'%',message_text) AS esimene_reavahetus
FROM [dbo].[MESSAGES]
Kui nüüd vaja reavahetust ka HTML koodina näidata või teha seda nii, et asendad andmebaasi CHAR(10) väärtuse HTML reavahe märgendiga <br />
näiteks kasutab asp:Label mille paneb veel asp:Panel sisse kerimisribade pärast
<asp:Panel runat="server" ID="PanelSisu" Height="250px" ScrollBars="Vertical">Miskipärast aga iga kord SQL SERVER-i CHAR(10) ja C# \n omavahel hästi ei ühildu.
<asp:Label ID="tbMessageBody" runat="server" ReadOnly="True"></asp:Label>
</asp:Panel>
Reeglina peaks töötama järgmine konstruktsioon
string msd = table.Rows[0]["message_text"].ToString();
msd = msd.Replace(Environment.NewLine, "<br />");
aga IIS6 miskipärast ei tööta. Üks mitte eriti ilus lahendus on see, et proovib erinevad variandid läbi. Sobib siis kui regulaaravaldsed pole just tugevaim külg.
string msd = table.Rows[0]["message_text"].ToString();
Regex regex = new Regex(@"(\r\n|\r|\n|\n\r)+"); //IIS6 peale ei tööta, IIS8 töötab
msd = regex.Replace(msd, "<br />");
msd = msd.Replace(Environment.NewLine, "<br />"); //see newline mõnikord ei tööta hästi IIS6
msd = Regex.Replace(msd, @"\r\n?|\n", "<br />"); //IIS6 peale töötab
Viisakas on muidugi väljund ennem AntiXSS teegi funktsioonist GetSafeHtmlFragment läbi lasta.
GetSafeHtmlFragment aga sööb reavahe <br /> märgendi ära.
Üle nurga lahendus võib olla selline, et pöörab reavahe mingiks vähetõenäolise stringijadaks. Näiteks "#####" ja peale GetSafeHtmlFragment funktsiooni asendab "#####" "<br />" märgendiga
string msd = table.Rows[0]["message_text"].ToString();
Regex regex = new Regex(@"(\r\n|\r|\n|\n\r)+");
msd = regex.Replace(msd, "#####");
msd = msd.Replace(Environment.NewLine, "#####"); //see newline mõnikord ei tööta hästi IIS6
msd = Regex.Replace(msd, @"\r\n?|\n", "#####"); //IIS6 peale töötab
this.tbMessageBody.Text = Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(msd).Replace("#####", "<br />");
reede, 24. mai 2013
ASP.NET ReportViewer 2010 mõnikord ei ühildu IE10-ga
Kui on tehtud veebivorm, mis kasutab .NET 4.0 ReportVieweriga tehtud komponenti siis mõningatel juhtudel veebilehte IE10-ga vaadates ei pruugi ReportViewer 2010 aruande sisu näidata, ilub tühi valge vorm, kusjuures Firefox ja Chrome vormi sisu näitavad aga IE10 mitte.
IE10-jaoks saab asja korda serveri poolt X-UA-Compatible päise lisamisega, näiteks IE=EmulateIE9
Teisi sirvikuid päise X-UA-Compatible pealepanek ei mõjuta
IE10-jaoks saab asja korda serveri poolt X-UA-Compatible päise lisamisega, näiteks IE=EmulateIE9
Teisi sirvikuid päise X-UA-Compatible pealepanek ei mõjuta
laupäev, 13. aprill 2013
VisualStudio2012 Update2 teeb WindowsXP jaoks C++ MFC projektid katki
Kui VisualStudio 2012 Update1 lisas võimaluse MFC C++ projekt kokku lasta ka WindowsXP peal töötamiseks, ehk projekti Configuration Properties -> Toolset -> tuli valida VisualStudio 2012 -Windows XP (v110_xp) ning valmis treitud exe läks käima ka WindowsXP peal siis VisualStudio 2012 Update2 on selle asja katki teinud ehk endist viisi programmi kokku lastes ja WindowsXP käivitades näeme ekraanil viga:
The procedure entry point InitializeCriticalSectionEx could not be located in the dynamic link library KERNEL32.dll
Kui rakendus kannatab saab programmi WindowsXP peal taas käima kui projekti Configuration Properties -> Toolset seada VisualStudio2010 peale
The procedure entry point InitializeCriticalSectionEx could not be located in the dynamic link library KERNEL32.dll
Kui rakendus kannatab saab programmi WindowsXP peal taas käima kui projekti Configuration Properties -> Toolset seada VisualStudio2010 peale
teisipäev, 19. märts 2013
SqlDataSource FilterParameters dünaamiline seadmine
SqlDataSource on abiks võimalus andmebaasist päringute tegemiseks eriti siis, kui vaja mõni veebivorm kokku lohistada. Lisaks võimaldab FilterParameters panna peale täiendava filtri andmebaasist saadud tulemustele.
Näiteks kui on vaja andmebaasist saadud infot filtreerida algus- ja lõppkuupäeva järgi siis
määrad SqlDataSource FilterParameters parameetrid
<FilterParameters>ja koodis sätid peale FilterExpressioni
<asp:Parameter Type="DateTime" Name="Algus" />
<asp:Parameter Type="DateTime" Name="Lopp" />
</FilterParameters>
this.SqlDataSourceArved.FilterParameters["Algus"].DefaultValue=Convert.ToDateTime(this.valitudaasta+"-01-01").ToShortDateString(); this.SqlDataSourceArved.FilterParameters["Lopp"].DefaultValue=Convert.ToDateTime(this.valitudaasta+"-01-01").AddYears(1).AddDays(-1).ToShortDateString();
string fil = "account_date >= #{0}# AND account_date <= #{1}#"; //kuupäev käib # vahele
this.SqlDataSourceArved.FilterExpression = fil;
ja seejärel GridView-le DataBind() ehk teeme päringu andmebaasi ja mis sealt andmebaasist kätte saame, sinna paneme täiendava filtri otsa. Sobib sageli GridView vormidele vürtsi lisamiseks, et andmed paremini hoomatavad oleksid
Kui aga vaja mitu hüpikmenüüd GridView-le lisada, ehk filtreerida muutuva arvu FilterParameters parameetrite järgi tuleb teha käsitööd, näiteks niimoodi, kus alguses tõmbad kõik FilterParameter parameetrid maha ja lisad seejärel ükshaaval juurde
string fil = "";
this.SqlDataSourceArved.FilterParameters.Clear(); //olemasolevad parameetrid minema
if (this.valitudKorrus != "") //filtreerib korruse järgi
{
this.SqlDataSourceArved.FilterParameters.Add( new Parameter("serviceId",TypeCode.String,this.valitudKorrus));
fil = "services_ID = '{0}'"; //string tüübi korral parameeter märkida '{0}'
}
if (this.valitudLeping != "") //filtreerib ka lepingu järgi
{
this.SqlDataSourceArved.FilterParameters.Add(new Parameter("contractId", TypeCode.UInt32, this.valitudLeping));
if (fil == "")
{
fil = "contracts_ID = {0}";
}
else
{
fil += " AND contracts_ID = {1}";
}
}
this.SqlDataSourceArved.FilterExpression = fil;
tulemuseks kodukootud hüpikmenüüdega GridView
Teada tuleb,et filtri püsivuse säilitamiseks tuleb FilterExpression seada ka GridView Sorting eventis. Siis säilib filter ka tabeli tulpade sorteerimise järel
esmaspäev, 4. veebruar 2013
DropDownListi täitmine väärtuse järgi sorteerimisega ListItem massiivist
Kui vaja asp:DropDownList täita sorteerituna ListItem massiivi väärtuste järgi saab seda teha nii:
ListItem[] items // siin on võti-väärtus andmepaaridena andmed
//sorteerime väärtuse järgi
System.Array.Sort(items, new myListItemComparer());
// item on nüüd sorteeritud
ListItemCollection col = new ListItemCollection();
//lisame kollektsiooni
for (int i = 0; i < items.Length; i++)
{
col.Add(new ListItem(items[i].Value,items[i].Text));
}
//paneme andmed külge
this.DropDownList1.DataSource = col;
this.DropDownList1.DataTextField = "Text";
this.DropDownList1.DataValueField = "Value";
this.DropDownList1.DataBind();
//väärtuse järgi sorteerimiseks vajalik klass
public class myListItemComparer : IComparer
{
int IComparer.Compare(object x, object y)
{
ListItem item_1 = x as ListItem;
ListItem item_2 = y as ListItem;
return item_1.Value.CompareTo(item_2.Value);
}
}
Kindlasti saab ka kuidagi lihtsamini
ListItem[] items // siin on võti-väärtus andmepaaridena andmed
//sorteerime väärtuse järgi
System.Array.Sort(items, new myListItemComparer());
// item on nüüd sorteeritud
ListItemCollection col = new ListItemCollection();
//lisame kollektsiooni
for (int i = 0; i < items.Length; i++)
{
col.Add(new ListItem(items[i].Value,items[i].Text));
}
//paneme andmed külge
this.DropDownList1.DataSource = col;
this.DropDownList1.DataTextField = "Text";
this.DropDownList1.DataValueField = "Value";
this.DropDownList1.DataBind();
//väärtuse järgi sorteerimiseks vajalik klass
public class myListItemComparer : IComparer
{
int IComparer.Compare(object x, object y)
{
ListItem item_1 = x as ListItem;
ListItem item_2 = y as ListItem;
return item_1.Value.CompareTo(item_2.Value);
}
}
Kindlasti saab ka kuidagi lihtsamini
Tellimine:
Postitused (Atom)