在Page_Load或DataBind期间尝试/捕获ASPX上的异常

时间:2013-10-31 03:05:29

标签: c# asp.net .net

我目前正在尝试帮助客户端使用C#和aspx编写的非常旧的.NET应用程序。 .NET和C#不是我通常使用的主要,第二甚至第三种技术,因此我对它们的了解相当有限。

最大的问题是我们没有应用程序的C#端的源代码,我们可以查看甚至编辑的唯一内容是aspx文件。

我们有一个页面给出了以下错误:

序列包含多个匹配元素

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.InvalidOperationException:Sequence包含多个匹配元素

来源错误:

Line 54:                            <asp:DataList ID="dlChoice" runat="server" DataSource='<%# GetChoices(Convert.ToInt32(Eval("QuestionId"))) %>' RepeatColumns="3" RepeatDirection="Horizontal" RepeatLayout="Table" EnableViewState="false">
Line 55:                                <ItemTemplate>
Line 56:                                    <span id='s<%# Eval("ChoiceId") %>' class='<%# GetChoiceStyle(Convert.ToInt32(Eval("ChoiceId"))) %>'><%# GetTextBoxes(Convert.ToInt32(Eval("QuestionId")), Convert.ToInt32(Eval("ChoiceId")),Convert.ToString(Eval("Points"))) %> <%# ReplaceToken(Eval("ChoiceText").ToString()) %></span>
Line 57:                                </ItemTemplate>
Line 58:                            </asp:DataList>     

源文件:e:\ inetpub \ webapp \ ScoringSheet.aspx行:56

堆栈追踪:

[InvalidOperationException: Sequence contains more than one matching element]
   System.Linq.Enumerable.SingleOrDefault(IEnumerable`1 source, Func`2 predicate) +1304639
   lambda_method(ExecutionScope ) +97
   System.Linq.EnumerableExecutor`1.Execute() +244
   System.Linq.EnumerableQuery`1.System.Linq.IQueryProvider.Execute(Expression expression) +154
   System.Linq.Queryable.SingleOrDefault(IQueryable`1 source, Expression`1 predicate) +422
   CPAT.ScoringSheet.GetChoiceStyle(Int32 choiceId) +298
   ASP.scoringsheet_aspx.__DataBind__control11(Object sender, EventArgs e) in e:\inetpub\webapp\ScoringSheet.aspx:56
   System.Web.UI.Control.OnDataBinding(EventArgs e) +132
   System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +170
   System.Web.UI.Control.DataBindChildren() +11045679
   System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +182
   System.Web.UI.WebControls.DataList.CreateItem(Int32 itemIndex, ListItemType itemType, Boolean dataBind, Object dataItem) +175
   System.Web.UI.WebControls.DataList.CreateControlHierarchy(Boolean useDataSource) +734
   System.Web.UI.WebControls.BaseDataList.OnDataBinding(EventArgs e) +89
   System.Web.UI.Control.DataBindChildren() +11045679
   System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +182
   System.Web.UI.WebControls.Repeater.CreateControlHierarchy(Boolean useDataSource) +674
   System.Web.UI.WebControls.Repeater.OnDataBinding(EventArgs e) +68
   System.Web.UI.Control.DataBindChildren() +11045679
   System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +182
   System.Web.UI.WebControls.ListView.CreateItemsWithoutGroups(ListViewPagedDataSource dataSource, Boolean dataBinding, InsertItemPosition insertPosition, ArrayList keyArray) +924
   System.Web.UI.WebControls.ListView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding) +838
   System.Web.UI.WebControls.ListView.PerformDataBinding(IEnumerable data) +46
   System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) +147
   System.Web.UI.WebControls.DataBoundControl.PerformSelect() +261
   System.Web.UI.WebControls.ListView.PerformSelect() +74
   CPAT.ScoringSheet.Page_Load(Object sender, EventArgs e) +3500
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +42
   System.Web.UI.Control.OnLoad(EventArgs e) +132
   System.Web.UI.Control.LoadRecursive() +66
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2428

版本信息:Microsoft .NET Framework版本:2.0.50727.5420; ASP.NET版本:2.0.50727.5420

我的问题:我如何添加足够的错误处理来显示一个很好的小错误消息,其中有令人讨厌的标签,但允许页面的其余部分呈现?这样我就可以看到数据集的哪个部分存在问题。我怀疑数据库中存在某些错误(重复记录,错误数据等),但我无法找到或看到正在运行的查询以及哪些数据正在破坏页面。

我尝试添加各种try / catch块但我怀疑这些数据绑定是以某种方式单独运行的,我添加的try / catch只是被忽略而且页面仍然是错误。

1 个答案:

答案 0 :(得分:1)

问题似乎发生在方法CPAT.ScoringSheet.GetChoiceStyle(Int32 choiceId)内部。特别是在linq查询中似乎存在一个SingleOrDefault调用,如果给定输入有多个元素,则会失败。

如果这不是有效条件,我会检查数据并将其修复到数据中。否则,您将不得不更改所述方法中的代码以允许更多元素。