Tuesday, June 2, 2015

Finding which event fired(button clicked) in Page_Load or Page_Init/Page_PreInit

I was working on an app and I wanted to turn off Event Validations when a certain action was performed to Render the HTML. Keeping them on won't let me render my UserControl to an HTML file. So I wanted to capture the Event right in Page_PreInit so that I can disable Event Validation of Page. Note that this can only be done either programmatically before Page is Initialized, or as a Page directive in aspx file.

Request.Form["__EVENTTARGET"] is the variable that will capture the information for the button clicked.

One additional aspect to note is to have UseSubmitBehavior="false" for the Button Web Control to generate the value for "__EVENTTARGET".

So in your html:

<asp:Button runat="server" ID="btnDownload" UseSubmitBehavior="false" ClientIDMode="Static" Text="Download" style="display:none;" OnClick="btnDownload_Click" />

In code behind, this is what you would have:


protected void Page_PreInit(object sender, EventArgs e) 
 { 
if (Request.Form["__EVENTTARGET"] != null && Request.Form["__EVENTTARGET"].Contains("btnDownload"))
Page.EnableEventValidation = false;//(NO INTELLISENSE!)disable event validation when the button is clicked for downloading file
}

Friday, May 15, 2015

Filtering/Grouping by multiple columns in sql subquery

I have been struggling for a while to have multiple columns in subquery and then filtering out the result.

Often with composite keys in the staging table, you want to check if there are any duplicates.

Taking an example of a fictitious "sales" table:

select * from sales where order_number in
(select order_number from sales
group by order_number, customer_id
having count(*)>1)

Above query might not give the desired results if I am looking for particular results with filters. The reason being I did not apply all the fields in the select query for the ones used in group by.

An extensible solution below takes care of that:

--Use CTE to store result for further filtering
with cte as (select s1.field1, s1.field2, s1.field3 from sales as s1
where exists
--Have a subquery for multiple column grouping. Compare it with the fields of the parent query, which would yield 1 corresponding record
(select s2.field1, s2.field2, sd.field3  from sales as s2
where s2.field1=sd1.field1 and s2.field2=s1.field2 and sd.field3=s1.field3
group by field1,field2,field3
) --Have your extra condition here for filtering
)
select * from cte where reached_target='Y'  -- Get all those qualified records needed

In this case, Common Table Expression (CTE) does come in very handy to filter out the final resultset.

Tuesday, April 21, 2015

Defining and using Server variables in the html head section of page

My browser was caching the javasscripts and css and it gets annoying when you are multiple design changes to code. So I decided to do cache busting. I defined a Random number variable in code behind and wanted to use it in html <head> so that every time a request is made, the browser takes it as a new request to the server with a fresh copy of styles and javascript files. The solution is a little quirky, but works:

     <link href="mystyle.css?rn=<%="" +Rand %>" type="text/css" rel="stylesheet"/>

where:
rn : is variable for Random Number
Rand : is server side generated Random number

Considering the Random number generated as 1234, the output would be like below:

     <link href="mystyle.css?rn=1234" type="text/css" rel="stylesheet"/>


Note: Use this for development only. Caching is always good to have in production to speed up loading times. With any new build of css/javascript, a version number can be assigned to get a fresh copy.

Wednesday, October 23, 2013

Doing a LoC count in Visual Studio

I just wanted to know how many lines of Code do I have in my Solution. Here's a nice trick posted by a fellow blogger that uses Regular Expressions. Way to go! Quick and Easy!

http://blog.schuager.com/2009/01/line-count-in-visual-studio.html

Basically, search for the Following Regex in the solution:

^~(:Wh@//.+)~(:Wh@\{:Wh@)~(:Wh@\}:Wh@)~(:Wh@/#).+

Wednesday, October 2, 2013

Using Razor syntax with Javascript

Following approach was done to have the razor syntax in Javascript. Wrapping the javascript <text> with does the job!

@if(Model!=null){
<text>"<span style="color: #76768d; font-size: 14px; font-weight: bold;">@Model.title</span>" +</text>
}


Although the code above looks like Razor syntax placed in HTML, this has been used in Javascript and works perfect!

Friday, September 20, 2013

Using CKEditor in your MVC project

CKEditor is an Amazing Rich Text Editor to be used in your MVC Applications. I had implemented that one of my forms and was bent over to implement it throughout the project, replacing the existing editor which was little buggy.

Implementation has been made very easy with the release of the newer version of CKEditor 4

First you need to use the HTMLHelpers to create a Text Area:

@Html.TextArea("controlid", "controlvalue")   


Then place your CKEditor javascript script below the control. This will replace the TextArea with the Editor

CKEDITOR.replace('controlid', {
                uiColor: '#808080',
                height: '120px',
                toolbar: [
           ['Bold', 'Italic', 'Underline', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink', '-', 'Image', 'Table'],
           ['FontSize', 'TextColor', 'BGColor', 'Source'],
                //                                ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock']
          ]
            });


Form submission is magically taken care of by MVC Approach on postback

But all that was not plain and simple on Ajax based submissions. I had some trouble implementing it on one of the Ajax based forms. This is what I did based upon the CKEditor API
the click of the submit button.

$(document).ready(function() {

    $("#btnSubmit").click(function(){

        $("#controlid").val(CKEDITOR.instances["controlid"].getData());

    });

});


And I had Success at last!

Wednesday, August 7, 2013

Using Jquery and JQuery UI inside AJAX UpdatePanel

I wanted to call a JQuery "alert" on the Click event of a button, which was also a Trigger to an Update Panel. My condition for the alert was in code behind. For those who experienced this, JQuery/javascript doesn't work nicely with UpdatePanel

Searching on Google led me to the solution below and it works as expected!

protected void btnPrevious_Click(object sender, ImageClickEventArgs e)
     int curpageindex=-1;
     if ((int)ViewState["Pageindex"] > 0)
     { 
         //Your code
         BindData();
     }
     else if ((int)ViewState["Pageindex"] == 0) 
         ScriptManager.RegisterStartupScript([updatePanelId], this.GetType(), "click", "firstrecord();", true);                       }
 
Please bear in mind that ScriptManager is the Ajax ScriptManager that has different overloading Parameters, one of them being a reference to the UpdatePanel.

Here's a nice explaination of how this works.

Monday, June 3, 2013

Using Mercurial as a preferred Source Control

I needed a Source Control to track changes in my projects, I have been hearing good things about Mercurial and its integration into Visual Studio 2010 with the tools like TortoiseHg and VisualHg. Not to mention that Mercurial is an Open Source software and available for free download. Mercurial is a Distributed Version Source Control (DVCS) where each client has entire copy of the repository.

Got a jump start on Installing and integrating Mercurial with a great video here, which shows all the installing as well as configuration process.

Mercurial can be downloaded here.

Its fun to work with Mercurial using the Command line too, though the GUI does take care of your needs. Here's a neat list of commands to execute your changes:

http://searchco.de/lists/list-of-mercurial-commands

One of the important commands that I would like to remember is in below example, which fetches me the changeset along with the filename. I can also specify the range of the changeset. In the example shown, the command will fetch the changes between the changesets 1 and 10.

hg log --stat -r 1:10


I also would like to include the .hgignore file which is quite handy for committing the changes to the repository.

# use glob syntax
syntax: glob

*.obj
*.pdb
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.scc
*.DotSettings
[Bb]in
[Dd]ebug*/**
obj/
[Rr]elease*/**
_ReSharper*/**
NDependOut/**
packages/**
[Tt]humbs.db
[Tt]est[Rr]esult*
[Bb]uild[Ll]og.*
*.[Pp]ublish.xml
*.resharper
*.ncrunch*
*.ndproj


Enjoy!

Wednesday, May 8, 2013

Passing down a string with an apostrophe to javascript function

Its like back to  Javascript 101, but sometimes its forgotton and takes up some time to identify whats wrong with the script. Thats what happened to me. I wasn't sure how would I parse my string. Finally got an answer.

 Edit Content

The escape character takes care of the apostrophe, and the HtmlDecode takes care of any browser based compatibility issues

Tuesday, April 16, 2013

Connecting to a Remote SQL Server and Import Data from your local SQL Server (2008 Express)

I have a remote database sitting on VPS and I need to transfer the data to the remote server. All I do is first register/connect the remote Sql server in my Management Studio. For this, enter the provided server name using the registered domain name (or IP Address)  along with the provided port number. Append the Sql server name (I appended \SQLExpress).

Doing this will enable you to connect the remote server in your local management studio (assuming you enter the correct authentication details for username/password !).

Before you go ahead with the next step of doing data migration, make sure first you run the database scripts so that your indexes/foreign keys are intact. Once this is done, you can use the import/export wizard to export data from your local machine to the remote server. A tiny trick is to use the import wizard from the destination database rather than using the export wizard from the source database. This will ensure your configuration for destination database is aptly configured.

Sorry this is very bland write-up without any screenshots or proper explanation, but hopefully I'll provide them when I have more time.