今天升级一个老程序,其中有段代码感觉很奇怪,虽然是自己写的,但时间长了一时也记不得当时的想法。仔细看了看明白是为了解决URL编码问题采取的变通方法,鉴于当时的经验倒也可以理解。
问题简单描述如下:在GridView中绑定一列数据为URL链接,参数中可能会有中文字符需要进行URL编码,直接设置HyperLinkField并不会自动进行编码。
那么应该怎么办呢?
先说下以前的“笨办法”,在RowDataBound方法中,通过代码拼凑URL字串,然后赋值到相应的单元格,URL编码可以代码中实现。
这种方法使用起来没啥问题,只是现在看来不太完美,那么有没有更好的解决方案?
有!请看。
首先我们还是按HyperLinkField配置好需要生成URL的字段,然后选择“将此字段转换为TemplateField,切换到”源“,我们会看到VisualStudio自动生成的模板列,类似下面的代码:
<asp:TemplateField HeaderText="物料清单"> <ItemTemplate> <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# "show.aspx?wlbm=" + Server.UrlEncode(Eval("wlbm").ToString()) + "&wlmc=" + Server.UrlEncode(Eval("wlmc").ToString()) %>' Target="_blank" Text="物料清单"></asp:HyperLink> </ItemTemplate> <HeaderStyle HorizontalAlign="Center" Width="100px" /> <ItemStyle HorizontalAlign="Center" Width="100px" /> </asp:TemplateField>注意<%# %>标识,这实际上是嵌入了一段服务端代码,我们可在这里应用UrlEncode方法进行URL编码,这样就省去了在代码中拼凑URL的过程。
当然,有人会诟病这种将前后端代码混在一起的做法,还不如以前在代码中实现呢。
我觉得WebForm方式是没办法避免这种情况,对于要求快速实现功能的小系统来说,效率才更重要。