我有一个按名称搜索产品的页面。 在许多页面中,我使用产品代码。如果用户不知道产品代码,我让他转到此页面,按名称搜索,然后选择其中一个结果并返回他来自的页面。
在按名称搜索的结果中,我设置了一个HyperLinkField,它将重定向到某个页面,并带有产品代码的参数。
我的代码是这样的:
<asp:GridView ID="GridView1" Runat="server"
DataSource='<%# GetData(pName.Text) %>' AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="Name">
<ItemStyle HorizontalAlign="Center"
VerticalAlign="Middle"></ItemStyle>
</asp:BoundField>
<asp:BoundField DataField="Code"></asp:BoundField>
<asp:ImageField ControlStyle-Width="150px" ControlStyle-Height="150px" DataImageUrlField="PictureURL" ></asp:ImageField>
<ASP:HYPERLINKFIELD text=">>" datanavigateurlfields="Code" datanavigateurlformatstring="priceUpdater.aspx?ProductCode={0}"></ASP:HYPERLINKFIELD>
</Columns>
</asp:GridView>
其中GetData是一个函数,它返回一个Product类型的对象,包含字段,名称,代码,图像等。
如您所见,HYPERLINKFIELD中的此链接将重定向到名为priceUpdater的页面,其中包含产品代码的参数。
我希望这个页面是动态的。 我试图像这样添加一个参数到搜索页面
<%string pageRequested = Page.Request.QueryString["SearchScreen"];%>
现在我试图像这样使用HYPERLINK:
<ASP:HYPERLINKFIELD text=">>" datanavigateurlfields="Code" datanavigateurlformatstring="<%=pageRequested%>.aspx?ProductCode={0}"></ASP:HYPERLINKFIELD>
但链接引用的页面与wrriten(http://mysite.com/%3C%=pageRequested%&gt; .aspx?ProductCode = 2450)一样纯文本
我该如何做到这一点?
谢谢!
答案 0 :(得分:3)
如果要使用HyperLinkField
,则需要使用GetData
查询字符串参数附带的值扩展pageRequested
方法返回的数据源对象。
在这种情况下,HyperLinkField的标记将如下:
<asp:HyperLinkField text=">>"
datanavigateurlfields="PageRequested,Code"
datanavigateurlformatstring="{0}.aspx?ProductCode={1}"></asp:HyperLinkField>
但是,只有将PageRequested
作为公共字段或属性添加到GetData
方法返回的对象时,此方法才有效。
如果这不是一个选项,那么您需要实施自己的"LinkField"
控件,该控件继承自DataControlField
或使用ItemTemplate
Nitin建议。
答案 1 :(得分:1)
尝试:
<asp:TemplateField>
<ItemTemplate>
<ASP:HYPERLINK text=">>" NavigateUrl='<%# String.Format("~/{0}.aspx?ProductCode={1}",Page.Request.QueryString["SearchScreen"],Eval("Code")) %>'></ASP:HYPERLINK>
</ItemTemplate>
</asp:TemplateField>
答案 2 :(得分:1)
将HYPERLINKFIELD替换为包含HyperLink的TemplateField,并将其绑定在grid的rowdatabound事件中
<强> ASPX:强>
<asp:GridView ID="GridView1" runat="server" DataSource='<%# GetData(pName.Text) %>'
OnRowDataBound="Grd_RowDatabound"
AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="Name">
<ItemStyle HorizontalAlign="Center" VerticalAlign="Middle"></ItemStyle>
</asp:BoundField>
<asp:BoundField DataField="Code"></asp:BoundField>
<asp:ImageField ControlStyle-Width="150px" ControlStyle-Height="150px" DataImageUrlField="PictureURL">
</asp:ImageField>
<asp:TemplateField>
<ItemTemplate>
<asp:HyperLink ID="lnkNavigate" runat="server" NavigateUrl="" Text=">>"></asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<强>代码隐藏强>
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
GridView1.DataBind();
}
public List<myData> GetData(string param)
{
List<myData> lst = new List<myData>();
lst.Add(new myData() { Name = "Hello", Code = "World", PictureURL = "Images/Select.png" });
return lst;
}
public string pageRequested
{
get {
return Page.Request.QueryString["SearchScreen"];
}
}
protected void Grd_RowDatabound(Object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
HyperLink lnkNavigate = (HyperLink)e.Row.FindControl("lnkNavigate");
if (lnkNavigate != null)
{
myData obj = (myData)e.Row.DataItem;
lnkNavigate.NavigateUrl = pageRequested + ".aspx?ProductCode="+obj.Code;
}
}
}
}
public class myData
{
public string Name { get; set; }
public string Code { get; set; }
public string PictureURL { get; set; }
}