4

我有一个按名称搜索产品的页面。在许多页面中,我使用产品代码。如果用户不知道产品代码,我让他到这个页面,按名称搜索,然后选择其中一个结果返回他来自的页面。

在按名称搜索的结果中,我设置了一个 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> 

但是链接所指的页面与所写的一样纯文本(http://mysite.com/%3C%=pageRequested% >.aspx?ProductCode=2450)

我怎样才能使这项工作?

谢谢!

4

3 回答 3

3

如果要使用HyperLinkField,则需要使用查询字符串参数GetData附带的值扩展方法返回的数据源对象。pageRequested

在这种情况下,HyperLinkField 的标记将如下:

<asp:HyperLinkField text=">>" 
    datanavigateurlfields="PageRequested,Code"
    datanavigateurlformatstring="{0}.aspx?ProductCode={1}"></asp:HyperLinkField>

但这仅在您将PageRequested作为公共字段或属性添加到GetData方法返回的对象时才有效。

如果这不是一个选项,那么您需要实现自己的"LinkField"控件,继承自DataControlField或使用NitinItemTemplate建议的控件。

于 2013-07-29T19:44:31.433 回答
1

将 HYPERLINKFIELD 替换为包含 HyperLink 的 TemplateField 并将其绑定到网格的 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; }
}
于 2013-07-23T08:06:30.010 回答
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>
于 2013-07-23T07:27:53.377 回答