ASP.NET中GridView的ObjectDataSource的Delete和Insert方法的问题

时间:2011-11-28 18:57:35

标签: asp.net gridview objectdatasource

我想在ASP.NET中使用带有GridView的ObjectDataSource。在GridView中显示数据有效。现在我将一个CommandField添加到GridView,以便还可以编辑数据。更新方法工作正常,但我有删除和插入问题:

  1. 当我单击GridView中的Delete链接时,将调用已配置的DeleteMethod,但使用错误的 testSystemEndpoint 参数。它不是应该删除的业务对象,而是一个所有字段都为“null”的裸实例。因此,配置的DeleteMethod无法删除该条目。
  2. 当我单击GridView中的Insert链接时,没有任何反应。未调用已配置的InsertMethod。
  3. 我的ObjectDataSource如下所示:

    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
            DataObjectTypeName="[...].TSEndpoint" 
            DeleteMethod="Remove" InsertMethod="Add" 
            OldValuesParameterFormatString="original_{0}" SelectMethod="GetTSEndpoints" 
            TypeName="[...].TSRepository" 
            UpdateMethod="Update"></asp:ObjectDataSource>
    

    我的BusinessObject Manager是TSRepository.cs:

    [DataObject]
    public class TSRepository : ITSRepository
    {
        private ISessionFactory _sessionFactory;
        private Configuration _configuration;
    
        public TSRepository()
        {
            _configuration = new Configuration();
            _configuration.Configure();
            _configuration.AddAssembly(typeof(TSEndpoint).Assembly);
            _sessionFactory = _configuration.BuildSessionFactory();
        }
    
        [DataObjectMethod(DataObjectMethodType.Insert)]
        public void Add(TSEndpoint testSystemEndpoint)
        {
            if (testSystemEndpoint != null)
            {
                using (ISession session = NHibernateHelper.OpenSession())
                using (ITransaction transaction = session.BeginTransaction())
                {
                    session.Save(testSystemEndpoint);
                    transaction.Commit();
                }
            }
        }
    
        [DataObjectMethod(DataObjectMethodType.Update)]
        public void Update(TSEndpoint testSystemEndpoint)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Update(testSystemEndpoint);
                transaction.Commit();
            }
        }
    
        [DataObjectMethod(DataObjectMethodType.Delete)]
        public void Remove(TSEndpoint testSystemEndpoint)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Delete(testSystemEndpoint);
                transaction.Commit();
            }
        }
    
        [DataObjectMethod(DataObjectMethodType.Select)]
        public ICollection<TSEndpoint> GetTSEndpoints()
        {
            using (ISession session = NHibernateHelper.OpenSession())
            {
                var testSystems = session
                    .CreateCriteria(typeof(TSEndpoint))                    
                    .List<TSEndpoint>();
                return testSystems;
            }
        }
    }
    

    如果有人可以帮我解决我的两个问题,我会很高兴。

2 个答案:

答案 0 :(得分:4)

对于问题1,我花了相当多的时间在我自己的代码中追踪一个非常类似的问题。

对我来说,解决方案是将gridview中的DataKeyNames属性设置为我的对象的主键的列名。一旦我这样做,一切都很完美。

答案 1 :(得分:0)

关于问题2:我仍然不知道为什么不调用InsertMethod。但是这个解决方法现在对我来说还可以:我只是在GridView下创建一个表单来添加一个新条目。