我遇到一个非常奇怪的问题,一个是GridView,一个ObjectDataSource和一个组中的两个RadioButtons。几周后查看实时代码和简化示例,我找不到解决方案。我认为它可能是ASP.Net中的一个错误,所以想知道是否有人遇到过类似的东西?感激地收到任何意见或建议 - 我已经尝试了我能想到的一切。
GridView的EnableViewState设置为false,这会导致Select和Count方法被调用两次 - 一次,以便GridView可以在回发之前计算出它的状态,并且一次可以获得新数据显示。 (在这种情况下,GridView不执行CRUD操作,因此调用Select和Count方法两次是不需要的行为,但我找不到任何阻止它的方法。)
页面上控件的值使用select参数传递给ObjectDataSource(这些参数用于选择要显示的数据)。
当第二次调用count和select时,所有值总是正确的。但是,当它进行第一次调用时,包含文本框内容的参数始终是正确的,但作为组的一部分的RadioButton的参数是错误的。这会导致返回错误的计数,从而影响分页。该问题似乎只影响组中的RadioButton - 当未指定组时,它们正常工作。
从简化示例中,这里是文本框,导致回发的按钮和单选按钮:
<asp:TextBox ID="txtSearch" runat="server"
Width="160px" Height="23px"></asp:TextBox>
<asp:TextBox ID="txtSearch2" runat="server"
Width="160px" Height="23px"></asp:TextBox>
<asp:Button ID="cmdGo" runat="server" Width="75px" Height="24px" Text="Find!"
EnableViewState="true"></asp:Button>
<div class="OptionGroupSpacer">-</div>
<div class="OptionGroup">
<asp:RadioButton ID="Option1" runat="server" Text="Option1"
GroupName="Group1" EnableViewState="true" />
<asp:RadioButton ID="Option2" runat="server" GroupName="Group1"
Text="Option2" EnableViewState="true" /></div>
带有选择参数的ObjectdataSource:
<asp:ObjectDataSource ID="EntriesDataSource" runat="server"
TypeName="Dictionary.clsEntryDAL"
SortParameterName="SortExpression"
SelectMethod="SelectEntries" EnablePaging="True"
SelectCountMethod="Count" EnableViewState="true" >
<SelectParameters>
<asp:ControlParameter ControlID="txtSearch" Name="txtSearch"
PropertyName="Text" Type="String" />
<asp:ControlParameter ControlID="txtSearch2" Name="txtSearch2"
PropertyName="Text" Type="String" />
<asp:ControlParameter ControlID="Option1" Name="Option1"
PropertyName="Checked" Type="Boolean" />
<asp:ControlParameter ControlID="Option2" Name="Option2"
PropertyName="Checked" Type="Boolean" />
</SelectParameters>
</asp:ObjectDataSource>
GridView(包含来自ASP.Net AJAX Control Toolkit的评级控件。)
<asp:GridView ID="grdEntriesNew" runat="server" AllowPaging="True" CellPadding="4"
DataSourceID="EntriesDataSource" AutoGenerateColumns="False" Visible="true" CssClass="Entries"
BorderStyle="None" GridLines="None" ShowHeader="false" EnableViewState="false">
<RowStyle CssClass="Row" />
<AlternatingRowStyle CssClass="AlternatingRow" />
<Columns>
<asp:BoundField DataField="NewLayout" DataFormatString="{0}" HtmlEncode="false" Visible="true" />
<asp:TemplateField ControlStyle-Width="52px" ItemStyle-Width="52px" ItemStyle-VerticalAlign="Top">
<ItemTemplate>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<ajaxToolkit:Rating runat="server" ID="DynamicRating1" CurrentRating='<%# Bind("Votes") %>'
MaxRating="3" CssClass="ratingStar" StarCssClass="ratingItem" WaitingStarCssClass="Saved"
FilledStarCssClass="Filled" EmptyStarCssClass="Empty" AutoPostBack="False" Width="42px"
Enabled="False" ReadOnly="True" Tag='<%# Bind("ID") %>' BorderStyle="None" ToolTip="Please vote"
BorderWidth="3px" EnableViewState="true">
</ajaxToolkit:Rating>
</ContentTemplate>
</asp:UpdatePanel>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="EditLink" DataFormatString="{0}" HtmlEncode="false" Visible="true" ItemStyle-Width="30px">
<ItemStyle Width="30px"></ItemStyle>
</asp:BoundField>
</Columns>
</asp:GridView>
这会导致计数和选择方法
Public Function count(ByVal txtSearch As String, _
ByVal txtSearch2 As String, _
ByVal Option1 As Boolean, _
ByVal Option2 As Boolean, _
ByVal CurrentUserID As Integer) As Integer
...
和
Public Function SelectEntries(ByVal txtSearch As String, _
ByVal txtSearch2 As String, _
ByVal Option1 As Boolean, _
ByVal Option2 As Boolean, _
ByVal maximumRows As Integer, _
ByVal startRowIndex As Integer, _
ByVal SortExpression As String, _
ByVal CurrentUserID As Integer) As IList(Of clsEntryShort)
...
在第一次搜索完成时调用一次,在每次后续搜索时调用两次。
在后续搜索中,第一次调用count和select方法时,从文本框读取的txtSearch和txtSearch2字符串值始终是正确的,但从RadioButtons读取的Option1和Option2布尔值是错误的。
只有当RadioButton在一个组中时才会出现问题 - 而不是当他们不在一个组中时。文本框始终完美无缺。
GridView包含ASP.Net AJAX控件,它们与GridView数据绑定到相同的数据 - 如果这些控件不存在,则Select和Count方法不会被调用两次。
只有在GridView的EnableViewState设置为false时才会出现问题(在此应用程序中不能简单地将EnableViewState设置为true,因为这会导致生成非常大的ViewState,从而导致性能问题)。
DropDownList控件似乎也存在这个问题,但我没有详细研究它们。
感激地收到任何想法!
谢谢!