Monday, February 22, 2010

Opening a new window after executing some code in a postback - Asp.Net

If we need to do a postback and then open a new window( equvalent to target = _blank) if a conditon is true, I think if we register a 'window.open(....)' script block on the click event of the link button when condition is true, it seems it opens the new window on your postback.
PS: RootUrl is bit critical here: I have tested RootUrl property. However you can use it if you want, but if you get problems please have a web.config configrued value for root url. We never know where it go wrong. It might work on local but when you deploy it to live or a in some extrem conditions it might stop working.

Here is an example:
<%@ Page Language="C#" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Test Page</title>
    <script runat="server">
        public string RootUrl
        {
            get
            {
                Uri requestUri = Context.Request.Url;
                HttpRequest request = Context.Request;
                string rootUrl = string.Format("{0}{1}{2}{3}{4}",
                    requestUri.Scheme,
                    Uri.SchemeDelimiter,
                    requestUri.Host,
                    requestUri.IsDefaultPort ? 
                        string.Empty : string.Format(":{0}", requestUri.Port),
                    request.ApplicationPath);
                return rootUrl.EndsWith("/") ? rootUrl : 
                        string.Format("{0}/", rootUrl);
            }
        }
        private string script = @"
            window.open('{0}','',
                'scrollbars=no,menubar=no,height=600,width=800,resizable=yes,toolbar=no,location=no,status=no');
        ";
        protected void OpenWindow(object sender, EventArgs e)
        {
            string page = string.Concat(
                  this.RootUrl, ((LinkButton)sender).CommandArgument);
            ///
            /// Check your condition
            ///
            bool myCondition = true;
            if (myCondition)
            {
                Page.ClientScript.RegisterClientScriptBlock(
                    this.GetType(),
                    this.GetType().Name,
                    string.Format(this.script, page),
                    true);
            }
        }        
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:LinkButton 
            runat="server" 
            ID="lnkButton" 
            OnClick="OpenWindow" 
            Text="Open a Window" 
            CommandArgument="Tutorials/Rocky/Training.pdf" />
    </form>
</body>
</html>
 

Read more panel like facebook wall : Asp.Net


Demo:

To simulate FaceBook exactly, and extend the html inside a rendered page we can use AJAX,  JQuery,  Generic handler and a very simple web control.
Here is a sample that I had a play with
PS: Web control been hosted in a assembly called Active.Web.UI.Controls. You must host your web controls in appropriate place and add a reference accordingly

Web Control and Domain Objects

public class PostView : WebControl
{
    public Post Post { getset; }
    public PostView()
    {
        Post = new Post();
    }
    public override void RenderBeginTag(HtmlTextWriter writer)
    {
        writer.Write(string.Format("<div class=\"{0}\">"this.GetType().Name));
    }
    protected override void RenderContents(HtmlTextWriter writer)
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendFormat(
                "<div class=\"Header\"><h3>{0}</h3></div>"this.Post.Title);
        sb.AppendFormat(
                "<div class=\"Content\"><p>{0}</p></div>"this.Post.Content);
        writer.Write(sb.ToString());
    }
    public override void RenderEndTag(HtmlTextWriter writer)
    {
        writer.Write("</div>");
    }
}

[Serializable]
public class Post
{
    public string Title { getset; }
    public string Content { getset; }
}
 
[Serializable]
public class Posts : List<Post>
{
    public Posts(string postId)
    {
        for (int i = 0; i < 25; i++)
        this.Add(new Post() { 
        Title = string.Format("Post {0}",(i + 1)), 
        Content = @"There are important differences between plain text files
        created by a text editor, and document files created by word processors
        such as Microsoft Word, WordPerfect, or OpenOffice.org. Briefly: A plain
        text file is represented and edited by showing all the characters as they
        are present in the file. The only characters usable for 'mark-up' are the
        control characters of the used character set; in practice this is newline, 
        tab and formfeed. The most commonly used character set is ASCII, 
        especially recently, as plain text files are more used for programming and 
        configuration and less frequently used for documentation than in the past. 
        Documents created by a word processor generally contain fileformat- 
        specific ""control characters"" beyond what is defined in the character 
        set. These enable functions like bold, italic, fonts, columns, tables, 
        etc. These and other common page formatting symbols were once associated 
        only with desktop publishing but are now commonplace in the simplest word 
        processor.Word processors can usually edit a plain text file and save in 
        the plain text file format. However one must take care to tell the program 
        that this is what is wanted. This is especially important in cases such as 
        source code, HTML, and configuration and control files. Otherwise the file 
        will contain those ""special characters"" unique to the word processor's 
        file format and will not be handled correctly by the utility the files 
        ere intended for." });
    }
}

Generic Hander - Named PostHandler.ashx

public class PostHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        int limit = int.Parse(context.Request.QueryString.Get("uBound"));
        string postId = context.Request.QueryString.Get("postId");
        Posts posts = new Posts(postId);
        StringBuilder sb = new StringBuilder();
        if (limit > 5)
        {
            sb.AppendFormat("::{0};", limit + 5 > posts.Count ? false : true);
            for (int i = limit - 5; i < limit; i++)
            {
                StringBuilder s = new StringBuilder();
                StringWriter tw = new StringWriter(s);
                HtmlTextWriter htw = new HtmlTextWriter(tw);
                (new PostView() { Post = posts[i] }).RenderControl(htw);
                sb.Append(s.ToString());
            }
        }
        context.Response.Write(sb.ToString());
    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

TestPage

<%@ Page Language="C#" AutoEventWireup="true"  %>
<%@ Import Namespace="Active.Web.UI.Controls" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Test Page</title>
    <script src="Scripts/jquery-1.4.1.min.js" 
            type="text/javascript" language="javascript"></script>
    <script runat="server">
        private string postId = "pid1234556";
        private string startupScript = @"
            var limit = 5;
            function ShowMorePosts() {{
                limit = limit + 5;
                $.ajax({{
                    url: 'Handlers/PostHandler.ashx?uBound=' + limit + ""&postId={0}"",
                    success: function (data) {{
                        if (data.match(""^"" + ""::True;"") 
                           != ""::True;"") $("".ShowMorePosts"").remove();
                        data = data.replace(/::true;/i, """");
                        data = data.replace(/::false;/i, """");
                        $("".PostList"").append(data);
                    }}
                }});
            }}
        ";
        protected override void OnInit(EventArgs e)
        {
            Posts posts = new Posts(this.postId);
            base.OnInit(e);
            for (int i = 0; i < 5 && i < posts.Count; i++)
                this.pnlPostList.Controls.Add(new PostView() { Post = posts[i] });
        }
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            this.Page.ClientScript.RegisterStartupScript(
                       this.GetType(), this.GetType().Name,
                       string.Format(this.startupScript, this.postId), true);
        }
    </script>
</head>
<body>
    Test Page
    <form runat="server" id="form1">
        <asp:Panel runat="server" ID="pnlPostList" CssClass="PostList" />
        <a href="javascript:ShowMorePosts()" 
              title="Show More Posts" 
              class="ShowMorePosts">Show More Posts</a>
    </form>
</body>
</html>
 
 
 
 
 
 

iPhone Launch Screen Sizes

iPhone Portrait iOS 8 Retina HT 5.5 = 1242 X 2208 Retna HD 4.7 = 750 X 1134 iPhone Landscape iOS 8 Retina HD 5.5  2208 X 1242 iPho...