When you want to use a query parameter passed to your page you’ll need litle bit of extra coding. There are few ways to accomplish that but in simple cases I like to use data binding expression just inside NavigateUrl attribute on Hyperlik’s and friends:
<wc:BindableHyperLink ID="newItem" runat="server" Text="Add" NavigateUrl='<%# "Details.aspx?action=new&ClientId=" + Request.QueryString["ClientId"] %>' />
Plain Hyperlink control does not dupport data binding expression, so I decided to write a adapter class adding binding support to Hyperlink (full code source attached below). Aside from usage using simple data binding expression (yet without actual data binding 🙂 ), you can use this control eg. within templates with actual data binding.
/* Copyright 2003-2007 Janusz Skonieczny
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Created by: WooYek on 13:20:43 2003-01-30
*
* Last changes made by:
* $Id: SqlCommon.cs 4318 2007-09-03 13:55:12Z wooyek $
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WooYek.Web.UI.WebControls {
public class BindableHyperLink : DataBoundControl {
private HyperLink link;
protected override void OnLoad(EventArgs e) {
DataBind();
base.OnLoad(e);
}
protected override void CreateChildControls() {
base.CreateChildControls();
link = new HyperLink();
link.Text = Text;
link.NavigateUrl = NavigateUrl;
Controls.Add(link);
}
public string NavigateUrl {
get { return (string) ViewState["NavigateUrl"]; }
set { ViewState["NavigateUrl"] = value; }
}
public string Text {
get { return (string) ViewState["Text"]; }
set { ViewState["Text"] = value; }
}
public string DataNavigateUrlFields {
get { return (string) ViewState["DataNavigateUrlFields"]; }
set { ViewState["DataNavigateUrlFields"] = value; }
}
public string DataNavigateUrlFormatString {
get { return (string) ViewState["DataNavigateUrlFormatString"]; }
set { ViewState["DataNavigateUrlFormatString"] = value; }
}
public string DataTextField {
get { return (string) ViewState["DataTextField"]; }
set { ViewState["DataTextField"] = value; }
}
public object SelectedItem {
get { return ViewState["SelectedItem"]; }
set { ViewState["SelectedItem"] = value; }
}
public string DataTextFormatString {
get {
string s = (string) ViewState["DataTextFormatString"];
if (string.IsNullOrEmpty(s)) {
return "{0}";
}
return s;
}
set { ViewState["DataTextFormatString"] = value; }
}
protected override void PerformDataBinding(IEnumerable data) {
EnsureChildControls();
if (data == null ) {
return;
}
if (!string.IsNullOrEmpty(DataSourceID)) {
//Guard.ArgumentNotNull(data,"data");
foreach (object dataItem in data) {
object textValue = DataBinder.GetPropertyValue(dataItem, DataTextField);
link.Text = String.Format(DataTextFormatString, Convert.ToString(textValue));
string[] fields = DataNavigateUrlFields.Split(',');
List urlParams = new List();
foreach (string field in fields) {
string fieldValue = Convert.ToString(DataBinder.GetPropertyValue(dataItem, field));
urlParams.Add(fieldValue);
}
link.NavigateUrl = String.Format(DataNavigateUrlFormatString, urlParams.ToArray());
// interesuje nas tylko pierwszy element
break;
}
}
}
protected override void OnDataBinding(EventArgs e) {
base.OnDataBinding(e);
}
}
}