Tuesday, December 1, 2009

Class for Sending email using Email templates (asynchronously)

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using System.Net.Mail;

namespace Classes.Miscellaneous
{
///
/// Created by Wilmer F. Pascual
///

public class Email
{
#region Properties
public string Subject { get; set; }
public string From { get; set; }
public string To { get; set; }
public string CC { get; set; }
public bool IsBodyHtml { get; set; }
public System.Collections.Generic.Dictionary BodyParameters { get; set; }
public string ErrorMessage { get; private set; }

const string PARAMETER_FORMAT = "<%{0}%>";
const string XML_Default_Sender_Email = "Default_Sender_Email";
const string XML_SMTP_Server = "SMTP_Server";
const string XML_SMTP_Port = "SMTP_Port";
const string XML_SMTP_User = "SMTP_User";
const string XML_SMTP_Password = "SMTP_Password";
const string ERROR_TEMPLATENOTEXIST = "Template does not exists.";
#endregion

public Email(){}

#region Methods
///
/// Adds a parameter name and value to the BodyParameters collection
///

///
///
public void AddBodyParameter(string parameterName, string parameterValue)
{
if (this.BodyParameters == null)
this.BodyParameters = new System.Collections.Generic.Dictionary();

this.BodyParameters.Add(string.Format(PARAMETER_FORMAT, parameterName), parameterValue);
}

///
/// Send email using the specified Email template
///

/// Path to the email template file
///
public bool Send(string templateFilename)
{
if (!System.IO.File.Exists(templateFilename))
{
throw new ArgumentException(ERROR_TEMPLATENOTEXIST, templateFilename);
}

MailDefinition md = new MailDefinition();
md.BodyFileName = templateFilename;
md.Subject = this.Subject;
if (string.IsNullOrEmpty(this.From))
md.From = Setting.GetSetting(XML_Default_Sender_Email).Value;
else
md.From = this.From;
md.CC = this.CC;
md.IsBodyHtml = this.IsBodyHtml;

System.Net.Mail.MailMessage mailMessage;

Control dummyControl = new Control();//the Control owner parameter is required so i just created a dummy - wfp
mailMessage = md.CreateMailMessage(this.To, this.BodyParameters, dummyControl); //pass the parameter-value collection; the CreateMailMessage will automatically replace the parameters with the value we specify - wfp

string serverSetting = Setting.GetSetting(XML_SMTP_Server).Value;
string portSetting = Setting.GetSetting(XML_SMTP_Port).Value;
string userSetting = Setting.GetSetting(XML_SMTP_User).Value;
string passwordSetting = Setting.GetSetting(XML_SMTP_Password).Value;

SmtpClient smtp = new SmtpClient(serverSetting, Convert.ToInt32(portSetting));
System.Net.NetworkCredential cred = new System.Net.NetworkCredential(userSetting, passwordSetting);
smtp.UseDefaultCredentials = false;
smtp.Credentials = cred;

try
{
//smtp.Send(mailMessage); send email synchronously -- wfp

//send email asynchronously -- wfp
SendEmailDelegate dc = new SendEmailDelegate(smtp.Send);
AsyncCallback cb = new AsyncCallback(this.SendEmailCallback);
IAsyncResult ar = dc.BeginInvoke(mailMessage, cb, null);
//

return true;
}
catch (Exception ex)
{
this.ErrorMessage = ex.Message;
return false;
}
}

#region For Asynchronous Email sending
//delegate for asynchronous sending of email -- wfp
public delegate void SendEmailDelegate(System.Net.Mail.MailMessage mailMessage);

//callback method
public void SendEmailCallback(IAsyncResult ar)
{
SendEmailDelegate del = (SendEmailDelegate)((System.Runtime.Remoting.Messaging.AsyncResult)ar).AsyncDelegate;
try
{
//bool result;
//result = del.EndInvoke(ar);
del.EndInvoke(ar);
//System.Diagnostics.Debug.WriteLine("\nSuccess on Send Email CallBack");
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("\nError on Send Email CallBack: " + ex.Message);
}
}
#endregion
#endregion
}
}

Share/Save/Bookmark

Thursday, October 22, 2009

Calling PageMethod using jQuery

a simple example:



html code:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<script src="jquery-1.3.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
function CallPageMethod()
{
var msg = '<%= this.Message %>';

$.ajax({
type: "POST",
url: 'default.aspx/MyPageMethod',
contentType: "application/json; charset=utf-8",
data: "{msg:'" + msg +"'}",
dataType: "json",
success: function(result){alert(result.d);},
error: function(result){alert(result.d);}
});

}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" Text="Call Page Method" OnClientClick="CallPageMethod(); return false;" />
<asp:Button ID="Button2" runat="server" Text="Postback" onclick="Button2_Click" />
</form>
</body>
</html>


code-behind:



protected string Message;

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Message = "hellooo";
}
}

[System.Web.Services.WebMethod]
public static string MyPageMethod(string msg)
{
return msg;
}

protected void Button2_Click(object sender, EventArgs e)
{

}



Share/Save/Bookmark

Tuesday, October 6, 2009

Httphandler to retrive data and return it in JSON format

using System.Web.Script.Serialization;

///
/// Created by Wilmer F. Pascual
///
public class getdata : IHttpHandler
{
const string JSON_ARRAY = "[{0}]";
const string JSON_RECORD = "{{0}}";
const string JSON_KEYVALUE = "\"{0}\":\"{1}}\"";
const string COMMA = ",";

///
/// Retrieve Subcategories for the specified Category
///
///
void GetSubCategories(HttpContext context)
{
int parentCategoryId = int.Parse(context.Request.QueryString[Classes.Constants.QS_CATID]);
IEnumerable subCats = Classes.SubCategory.GetAll(parentCategoryId);
JavaScriptSerializer jSer = new JavaScriptSerializer();
string jsonData = jSer.Serialize(subCats);

context.Response.ContentType = "application/json";
context.Response.ContentEncoding = Encoding.UTF8;
context.Response.Write(jsonData);
context.Response.End();
}

public void ProcessRequest(HttpContext context)
{
if (context.Request.QueryString[Classes.Constants.QS_CATID] != null)
{
GetSubCategories(context);
}
}

public bool IsReusable
{
get
{
return false;
}
}
}



....
the data return can then be used by jquery (ex. used in cascading dropdown list Category -> Subcategories)

$(document).ready(function()
{
$("#").change(function()
{
$("#").html("");
$("#").attr("disabled", "disabled");
$("#").append($("").val('').html('loading...'));
var catId = $("#").attr("value");
if(isNaN(catId)) return;
$.getJSON('http://?catid=' + catId, function(sucats)
{
$("#").html("");
$.each(sucats, function() {
$("#").append($("").val(this['CategoryId']).html(this['CategoryName']));
});
});
$("#").attr("disabled", "");
})
});


Share/Save/Bookmark

Monday, September 7, 2009

Extending Gridview to implement partial paging



///
/// Extended Gridview that supports Custom Paging w/o using ObjectDataSource
/// - wfp May 30, 2008
///

public class CustomGridView : GridView
{
public CustomGridView() : base() { }

[Browsable(true), Category("RafnexProperties")]
[Description("Set the virtual item count for this gridview")]
[DefaultValue (-1)]
public int VirtualCount
{
get { return ViewState["virtualcount"]==null? -1 : (int)ViewState["virtualcount"]; }
set { ViewState["virtualcount"] = value; }
}

private int CurrentPageIndex
{
get
{
return ViewState["cur_pIndex"] == null ? 0 : (int)ViewState["cur_pIndex"];
}
set
{
ViewState["cur_pIndex"] = value;
}
}

public override object DataSource
{
get
{
return base.DataSource;
}
set
{
base.DataSource = value;
//save current page index, this.PageIndex value will be reset along the way(i dont know which event =P ) so we need to save it to be able to use it on InitializePager - wfp
this.CurrentPageIndex = this.PageIndex;
}
}

protected override void InitializePager(GridViewRow row, int columnSpan, PagedDataSource pagedDataSource)
{
if (this.AllowPaging)
{
pagedDataSource.AllowCustomPaging = true;
if (this.VirtualCount > -1) pagedDataSource.VirtualCount = this.VirtualCount;
pagedDataSource.CurrentPageIndex = this.CurrentPageIndex;
}

base.InitializePager(row, columnSpan, pagedDataSource);
}
}



Share/Save/Bookmark

Sunday, August 23, 2009

How to search all tables in a SQL Server Database for a specific value

check this site: http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm

Here is the complete stored procedure code:
 CREATE PROC SearchAllTables (  @SearchStr nvarchar(100) ) AS BEGIN  
-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
-- Purpose: To search all columns of all tables for a given search string
-- Written by: Narayana Vyas Kondreddi
-- Site: http://vyaskn.tripod.com
-- Tested on: SQL Server 7.0 and SQL Server 2000
-- Date modified: 28th July 2002 22:50 GMT

CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
SET NOCOUNT ON
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
WHILE @TableName IS NOT NULL
BEGIN SET @ColumnName = ''
SET @TableName = ( SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY( OBJECT_ID( QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
), 'IsMSShipped' ) = 0 )
WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName = (
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @ColumnName )
IF @ColumnName IS NOT NULL BEGIN INSERT INTO #Results
EXEC ( 'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)
FROM ' + @TableName + ' (NOLOCK) ' + ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 )
END END END SELECT ColumnName, ColumnValue FROM #Results
END


Share/Save/Bookmark

Thursday, July 23, 2009

Download file HttpHandler


public class getfile : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
try
{
int fileId;
int.TryParse(context.Request.QueryString[Timeline.Constants.QUERYSTRING_FILEID], out fileId);
MyFileClass file = new MyFileClass(fileId); //retrieve file info

context.Response.Clear();
context.Response.ContentType = "application/octet-stream";

byte[] fileSize = File.ReadAllBytes(file.PhysicalPath);
context.Response.AddHeader("Content-Length", fileSize.Length.ToString());
fileSize = null;
context.Response.AppendHeader("Content-Disposition", string.Format("attachment;filename={0}", file.Filename));
context.Response.WriteFile(file.PhysicalPath);
context.ApplicationInstance.CompleteRequest();
}
catch (Exception ex)
{
context.Response.Write(ex.Message);
}

context.Response.End();
}

public bool IsReusable
{
get
{
return true;
}
}
}


Share/Save/Bookmark

Sunday, June 14, 2009

How to get the type of a System.__ComObject in COM Interop

string typename = Microsoft.VisualBasic.Information.TypeName(yourobject);

note: remeber to add the Microsoft.VisualBasic in your reference

Share/Save/Bookmark

Wednesday, June 3, 2009

How to retrieve Membership's PasswordAnswer

in .net's membership framework, as long as the provider's password format is set to "Encrypted" or "Clear" then developers will be able to retrieve and decode the password. that's ok. but, interestingly, membership does not provide a method to retrieve the "Password Answer" (the answer to the security question when resetting a user's password). one thing to note is that, the PasswordAnswer is encoded using the same algorithm used for the password encryption, thus, if we can decrypt the password then we could probably decrypt the PassswordAnswer using the same function that is being used to decrypt the password(i hope i still make sense). with this, a visit to your friendly reflector will show you MembershipProvider's DecryptPassword and UnEncodePassword methods. This will be all you'll be needing to be able to create your own method of retrieving the PasswordAnswer. The trick is to create a class that derives from the MembershipProvider class to be able to use the DecryptPassword(protected) and check out the implementation of the UnEncodePassword to be able to decode the byte[] returned by DecryptPassword. below is a sample implementation:




public class FalseMembershipProvider : MembershipProvider
{
#region Required Override Properties/Methods
...implement required properties/methods here
#endregion

///
/// Retrieves the Password Answer - wfp june 04 2009
///
///
///
public string GetPasswordAnswer(Guid providerUserKey)
{
Microsoft.Practices.EnterpriseLibrary.Data.Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase();
using (System.Data.Common.DbCommand cmd = db.GetSqlStringCommand("SELECT PasswordAnswer FROM aspnet_Membership WHERE UserID=@UserID"))
{
db.AddInParameter(cmd, "@UserId", DbType.Guid, providerUserKey);

object answer = db.ExecuteScalar(cmd);
if (answer != null)
return ProviderDecryptor(answer.ToString());
else
return null;
}
db = null;
}

///
/// Generic Decryptor function. Can be used to decrypt Password and Password Answer.
/// Only works if passwordFormat is set to "Encrypted" - wfp june 04 2009
///
///
///
internal string ProviderDecryptor(string encryptedText)
{
string decrypted = null;

if (!string.IsNullOrEmpty(encryptedText))
{
byte[] encodedbytes = Convert.FromBase64String(encryptedText);
byte[] decryptedbytes = base.DecryptPassword(encodedbytes);

if (decryptedbytes != null)
decrypted = System.Text.Encoding.Unicode.GetString(decryptedbytes, 16, decryptedbytes.Length - 16);
}

return decrypted;
}
}



Share/Save/Bookmark

Monday, January 26, 2009

Resizing image on the fly!


public partial class Thumbnail : System.Web.UI.Page
{
const string Q_IMG = "img";
const string Q_WIDTH = "w";
const string Q_HEIGHT = "h";

const int DEFAULT_WIDTH = 120;
const int DEFAULT_HEIGHT = 118;

int Thumbnail_Width
{
get
{
if (Request.QueryString[Q_WIDTH] != null)
return Convert.ToInt32(Request.QueryString[Q_WIDTH]);
else
return DEFAULT_WIDTH;
}
}

int Thumbnail_Height
{
get
{
if (Request.QueryString[Q_HEIGHT] != null)
return Convert.ToInt32(Request.QueryString[Q_HEIGHT]);
else
return DEFAULT_HEIGHT;
}
}

///
/// just a dummy delegate for the required GetThumbnailImageAbort delegate
///
///
public bool ImgAbort_Callback()
{
return false;
}


protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Request.QueryString[Q_IMG] != null)
{
try
{
using (System.Drawing.Image img = System.Drawing.Image.FromFile(Server.MapPath(Request.QueryString[Q_IMG])))
{
using (System.Drawing.Image thumb = img.GetThumbnailImage(
this.Thumbnail_Width,
this.Thumbnail_Height,
new System.Drawing.Image.GetThumbnailImageAbort(ImgAbort_Callback),
IntPtr.Zero))
{
Response.ContentType = "image/jpeg";
thumb.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
}
catch { }
}
}
}
}


Share/Save/Bookmark

Monday, January 12, 2009

Globalization and Localization in ASP.Net 2.0

I would really love to write about this topic that my drool flooded my laptop and broke it. I just implemented this on my new project and its working perfectly compared to the one our company is currently using. So without further ado, i would like to present...............the link, everything you need to know is already in there.

Share/Save/Bookmark

Saturday, January 3, 2009

Simple Delegate and Event Implementation Sample


class definition:

public class DelegateAndEvent
{
//it is a good practice to name your delegates with "EventHandler"
public delegate void ErrorEventHandler(DelegateAndEvent sender, ErrorEventArgs args);

//declare event
public event ErrorEventHandler ErrorRaised;

//a better way of returning values is to create a class which inherits the EventArgs class and add the
//desired property(ies)
public class ErrorEventArgs : EventArgs
{
private string _errmsg;
public string ErrorMessage
{
get { return _errmsg; }
set { _errmsg = value; }
}

public ErrorEventArgs() { }
public ErrorEventArgs(string error)
{
_errmsg = error;
}
}

/// Method to allow raising of error (can either be public or private)
public void RaiseError(string error)
{
if (!string.IsNullOrEmpty(error))
{
//check is event is not null (event has a subscriber)
if (ErrorRaised != null)
{
ErrorRaised(this, new ErrorEventArgs(error));
}
}

}
}


code behind:


public partial class _Default : System.Web.UI.Page
{
DelegateAndEvent dne = new DelegateAndEvent();

protected override void OnInit(EventArgs e)
{
base.OnInit(e);
dne.ErrorRaised += new DelegateAndEvent.ErrorEventHandler(dne_ErrorRaised);
}

protected void Page_Load(object sender, EventArgs e)
{
}

protected void btnEvent_Click(object sender, EventArgs e)
{
dne.RaiseError("Error was forced to be raised!");

}

void dne_ErrorRaised(DelegateAndEvent sender, DelegateAndEvent.ErrorEventArgs args)
{
lblError.Text = args.ErrorMessage;
}
}




Share/Save/Bookmark