【问题标题】:Problems with Delete and Insert methods of a GridView's ObjectDataSource in ASP.NETASP.NET 中 GridView 的 ObjectDataSource 的 Delete 和 Insert 方法的问题
【发布时间】:2011-11-28 18:57:35
【问题描述】:

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

  1. 当我单击 GridView 中的 Delete 链接时,会调用配置的 DeleteMethod,但使用了错误的 testSystemEndpoint 参数。它不是应该删除的业务对象,而是一个所有字段都为“空”的裸实例。因此配置的 DeleteMethod 无法删除该条目。
  2. 当我单击 GridView 中的插入链接时,没有任何反应。配置的 InsertMethod 没有被调用。

我的 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;
        }
    }
}

如果有人能帮助我解决我的两个问题,我会非常高兴。

【问题讨论】:

    标签: asp.net gridview objectdatasource


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您的回答!我只将对象的主键添加到 DataKeyNames 中,它仍然只是一个裸实例,所有字段都为“null”,除了 Id 字段。所以现在可以删除了。 :) 将其他字段添加到 DataKeyNames 使它们也出现在配置的 DeleteMethod 中。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      相关资源
      最近更新 更多