1

我目前正在使用实体框架,并且有一个 Gridview 显示数据库中的记录列表。我有一个使用删除命令的删除按钮。每条记录在服务器上都有一个与之关联的文件,因此当数据源引发删除事件时,我想获取文件名并从服务器中删除文件。奇怪的是,在我的 ds_Deleting 事件中,实体中的一些值是空的。我似乎无法弄清楚为什么。

我在gridview 中删除按钮的代码如下:

<asp:TemplateField HeaderText="Remove">
    <ItemTemplate>
        <asp:Button ID="btnRemove" runat="server" Text="Remove" CssClass="button_default" CommandName="Delete" OnClientClick="return confirm('Deleting this contract will also delete the file from the server. Continue?')" />
     </ItemTemplate>
 </asp:TemplateField>

代码隐藏中的 OnDeleting 事件如下所示:

protected void dsContracts_Deleting(object sender, EntityDataSourceChangingEventArgs e)
{
    ipiModel.Contract contract = (ipiModel.Contract)e.Entity;

    File.Delete(Path.Combine(ConfigurationManager.AppSettings["ContractUploadPath"], contract.FileName));
}

每次contract.FileName 的值为null,即使它在GridView 中正确显示。任何帮助将非常感激。谢谢!

4

3 回答 3

3

我设法弄清楚了这一点,并决定在这里写下来,以防其他人遇到同样的问题。我检查了 MSDN 上的文档以了解实体数据源的删除事件(可以在此处找到),它说

EntityDataSourceChangingEventArgs 对象的 Entity 属性用于访问要删除的对象。此对象的属性可能未完全设置。只需设置识别对象所需的属性。

所以这就是我得到空值的原因。我想出的解决方案可能并不理想,但它确实有效。我意识到主键 ContractID 总是有一个值,所以我用它从数据库中提取记录。这是我的代码:

protected void dsContracts_Deleting1(object sender, EntityDataSourceChangingEventArgs e)
{
    ipiModel.Contract ct = (ipiModel.Contract)e.Entity;

    using (var db = new ipiModel.ipiEntities())
    {
        var contract = db.Contracts.Where(c => c.ContractID == ct.ContractID).Single();

        File.Delete(Path.Combine(ConfigurationManager.AppSettings["ContractUploadPath"], contract.FileName));
    }
}
于 2011-09-27T13:57:28.943 回答
1

在 ASP.NET 动态数据列表页面上体验过这一点,并且考虑到 varchar 外键似乎存在错误(我相信微软已接受),任何解决方案都是一种解决方法(hack)。

为了解决具有默认值的表列的空值(例如 createdDate、CreatedBy 等),我最终在相关实体的部分类的构造函数中设置了默认值。

在上面的信息给出了仅加载唯一标识实体所需的列的线索之后,我发现为问题(外键)列添加另一个“默认”值解决了我的问题 - 即因为我没有任何级联删除或其他任何东西,实体的主键足以进行删除,它是检查外键(varchar)中的空值的其他处理 - 所以我只是在构造函数中将该列设置为 String.Empty,并且我设置的默认值被忽略...

例如

public partial class MyEntity
{

    public MyEntity()
    {
        CreatedDate = Datetime.Now;
        //Other default stuff
        MyProblemVarcharForeignKeyField = String.Empty;
    }
}

瞧!

于 2012-03-20T03:02:12.180 回答
0

您所要做的就是将您要在后面的代码中访问的属性绑定到一个对象。

您可以添加一个带有 Hidden 对象的 TemplateField 并将您想要使用的值绑定到它们,如下所示:

<asp:TemplateField HeaderText="Remove">
<ItemTemplate>
    <asp:HiddenField ID="HiddenField1" runat="server" value='<%# Bind("FileName") %>'/>
 </ItemTemplate>

于 2012-02-27T16:57:51.017 回答