Странное поведение ObjectDataSource

justQ
Дата: 14.06.2010 12:58:03
Есть вот такой тестовый примерчик:
+
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test_page.aspx.cs" Inherits="Backend.test_page" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ObjectDataSource ID="GridObjectDataSource" runat="server" SelectMethod="GetTestList"
            TypeName="Backend.Test" UpdateMethod="UpdateTest" 
            DataObjectTypeName="Backend.Test" OldValuesParameterFormatString="original_{0}">
        </asp:ObjectDataSource>
        <asp:GridView ID="TGridView" runat="server" AllowPaging="True" AllowSorting="True"
            DataSourceID="GridObjectDataSource" DataKeyNames="_id" >
            <Columns>
                <asp:CommandField ShowEditButton="True" ShowSelectButton="True" />
            </Columns>
        </asp:GridView>
        <asp:ObjectDataSource ID="DetailsObjectDataSource" runat="server" SelectMethod="GetTest"
            TypeName="Backend.Test" OldValuesParameterFormatString="original_{0}" 
            DataObjectTypeName="Backend.Test" 
            UpdateMethod="UpdateTest">
            <SelectParameters>
                <asp:ControlParameter ControlID="TGridView" Name="_id" 
                    PropertyName="SelectedValue" Type="Int32" />
            </SelectParameters>
        </asp:ObjectDataSource>
        <asp:FormView ID="TFormView" runat="server" DataSourceID="DetailsObjectDataSource">
            <EditItemTemplate>
                _id:
                <asp:TextBox ID="_idTextBox" runat="server" Text='<%# Bind("_id") %>' />
                <br />
                _num:
                <asp:TextBox ID="_numTextBox" runat="server" Text='<%# Bind("_num") %>' />
                <br />
                _txt:
                <asp:TextBox ID="_txtTextBox" runat="server" Text='<%# Bind("_txt") %>' />
                <br />
                <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update"
                    Text="Update" />
                 <asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False"
                    CommandName="Cancel" Text="Cancel" />
            </EditItemTemplate>
            <InsertItemTemplate>
                _num:
                <asp:TextBox ID="_numTextBox" runat="server" Text='<%# Bind("_num") %>' />
                <br />
                _txt:
                <asp:TextBox ID="_txtTextBox" runat="server" Text='<%# Bind("_txt") %>' />
                <br />
                <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert"
                    Text="Insert" />
                 <asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False"
                    CommandName="Cancel" Text="Cancel" />
            </InsertItemTemplate>
            <ItemTemplate>
                _id:
                <asp:Label ID="_idLabel" runat="server" Text='<%# Bind("_id") %>' />
                <br />
                _num:
                <asp:Label ID="_numLabel" runat="server" Text='<%# Bind("_num") %>' />
                <br />
                _txt:
                <asp:Label ID="_txtLabel" runat="server" Text='<%# Bind("_txt") %>' />
                <br />
                <asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" CommandName="Edit"
                    Text="Edit" />
                 <asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" CommandName="New"
                    Text="New" />
            </ItemTemplate>
        </asp:FormView>
    </div>
    </form>
</body>
</html>

using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;

namespace Backend
{
    public partial class test_page : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }

    [DataObjectAttribute]
    public class Test
    {
        public int _id { get; set; }
        public int? _num { get; set; } // <<<<------- проблема тут.
        public string _txt { get; set; }

        private static List<Test> _datalist;

        // данные для эксперимента
        public static List<Test> DataList
        {
            get
            {
                if (_datalist == null)
                {
                    _datalist = new List<Test>();

                    for (int i = 0; i < 42; i++)
                    {
                        Test t = new Test();
                        t._id = i;
                        t._num = null;
                        t._txt = (i * i).ToString();

                        _datalist.Add(t);

                    }
                }
                return _datalist;
            }
        }


        public Test() { }

        [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
        public static List<Test> GetTestList()
        {
            return DataList;
        }

        [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
        public Test GetTest(int _id)
        {
            Test ret = new Test();

            foreach (Test t in DataList)
            {
                if (t._id == _id)
                {
                    ret = t;
                    break;
                }
            }

            return ret;

        }

        [DataObjectMethodAttribute(DataObjectMethodType.Update, true)]
        public int UpdateTest(Test new_t)
        {
            int ret = 0;

            foreach (Test t in DataList)
            {
                if (t._id == new_t._id)
                {
                    t._num = new_t._num;
                    t._txt = new_t._txt;
                    ret = new_t._id;
                    break;
                }
            }

            return ret;

        }

        [DataObjectMethodAttribute(DataObjectMethodType.Insert, true)]
        public int InsertTest(Test new_t)
        {
            int ret = DataList.Max(pet => pet._id) + 1;
            new_t._id = ret;
            DataList.Add(new_t);

            return ret;

        }


    }


}


Проблема в том, что не выполняется инсерт или апдейт через формвью, если не заполнить поле _num. Ошибка какая-то маловразумительная:
+

Ошибка сервера в приложении '/'.

Индекс находился вне границ массива.

Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода. 

Сведения об исключении: System.IndexOutOfRangeException: Индекс находился вне границ массива.

Ошибка источника: 

Необработанное исключение при выполнении текущего веб-запроса. Информацию о происхождении и месте возникновения исключения можно получить, используя следующую трассировку стека исключений.

Трассировка стека: 


[IndexOutOfRangeException: Индекс находился вне границ массива.]
   System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value) +497

[Exception:  не является допустимым значением для 'Int32'.]
   System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value) +516
   System.ComponentModel.TypeConverter.ConvertFromInvariantString(String text) +55
   System.Web.UI.WebControls.ObjectDataSourceView.ConvertType(Object value, Type type, String paramName) +89
   System.Web.UI.WebControls.ObjectDataSourceView.BuildObjectValue(Object value, Type destinationType, String paramName) +167
   System.Web.UI.WebControls.ObjectDataSourceView.BuildDataObject(Type dataObjectType, IDictionary inputParameters) +214
   System.Web.UI.WebControls.ObjectDataSourceView.ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) +462
   System.Web.UI.DataSourceView.Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback) +92
   System.Web.UI.WebControls.FormView.HandleUpdate(String commandArg, Boolean causesValidation) +835
   System.Web.UI.WebControls.FormView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +509
   System.Web.UI.WebControls.FormView.OnBubbleEvent(Object source, EventArgs e) +95
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.FormViewRow.OnBubbleEvent(Object source, EventArgs e) +113
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +118
   System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +135
   System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +175
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

Информация о версии: Платформа Microsoft .NET Framework, версия:2.0.50727.3603; ASP.NET, версия:2.0.50727.3082

А через грид всё прекрасно обновляется. Также все работает, если методам обновления и вставки передавать не объект, а список полей. Или можно объявить _num как object. Но всё это как-то не то...
Как правильно решить такую проблему?
justQ
Дата: 17.06.2010 01:01:28
неужели, никто не сталкивался?
;-(