我曾经发布了一个关于避免在数据库中添加空行的线程。在点击添加行之前,无论用户是否取消了新行,它都会自动向数据库中添加空行。我想出来了,但现在出现了一个新问题。如果用户在编辑新行时决定重新加载页面(F5),它会在数据库中添加一个空白行,这对于我的情况来说是不行的。任何人都可以帮我弄清楚如何避免这种情况吗?
以下是我的插入代码:
protected void gv_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Insert") //- this is needed to explain that the INSERT command will only work when INSERT is clicked
{
gv.DataBind();
DataTable d = dbcon.GetDataTable("SELECT * FROM CIS.CIS_TRANS ORDER BY ID DESC", "ProjectCISConnectionString");
string transCode = "", fundCode = "", BSA_CD = "", DP_TYPE = "";
if (d.Rows.Count > 0)
{
transCode = d.Rows[0]["TRANS_CD"].ToString();
fundCode = d.Rows[0]["FUND_CD"].ToString();
BSA_CD = d.Rows[0]["BSA_CD"].ToString();
DP_TYPE = d.Rows[0]["DP_TYPE"].ToString();
if (transCode.Trim().Length > 0)
{
dbcon.Execute("INSERT INTO CIS.CIS_TRANS (ID,TRANS_CD) VALUES(CIS.S_CIS_TRANS.nextval,'')", "ProjectCISConnectionString");
gv.DataBind();
}
}
gv.EditIndex = gv.Rows.Count - 1;
}
else if (e.CommandName == "Cancel")
{
DataTable d = dbcon.GetDataTable("SELECT * FROM CIS.CIS_TRANS ORDER BY ID DESC", "ProjectCISConnectionString");
string transCode = "";
if (d.Rows.Count > 0)
{
transCode = d.Rows[0]["TRANS_CD"].ToString();
if (transCode.Trim().Length == 0)
{
dbcon.Execute(string.Format("DELETE CIS.CIS_TRANS WHERE ID = '{0}'", d.Rows[0]["ID"]), "ProjectCISConnectionString");
gv.DataBind();
}
}
}
}
答案 0 :(得分:2)
如果要避免用户插入空行,则需要验证器。将RequiredFieldValidator
添加到插入模板:
<asp:RequiredFieldValidator runat="server" ID="valFieldName"
< ControlToValidate="txtFieldName" ErrorMessage="FieldName is missing" />
在您的方法中,在插入数据库之前检查Page.IsValid == true
。
编辑:
如果您想完全避免回发,可以将整个网格插入UpdatePanel
:
<asp:UpdatePanel>
<ContentTemplate>
<asp:GrdiView>
....
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
现在,当用户点击F5时,他只是重新加载页面而不是回发插入命令。
答案 1 :(得分:0)
您似乎试图将太多逻辑带入代码的一部分。您将数据库逻辑放入按钮命令中。想象一下,用户只是垃圾邮件这个按钮。这会造成大量的空行。
尝试这种方法:划分数据库逻辑和UI逻辑(例如 MVVM )。这是今天常见的模式。
想象一下,您创建了所有对象,现在用户点击“保存”按钮(也可能通过更改行 - 无论如何)。执行保存命令后,您的视图模型(视图背后的逻辑)可以例如验证您的数据。因此,您可以更轻松地扩展UI上的功能(如上所述:验证或类似的东西)。
如果您希望使用当前代码执行此操作,则每次扩展都会越来越多 - 而且维护此代码并不需要花费太多时间。
在您的虚拟机中的所有内容发生(验证等)后,您的数据库中的事务命令可能会发生(类似于myEntities.Save())。此方法可以将业务对象正确转换为SQL并存储在数据库中。
这只是对MVVM模式的一个非常简短的解释,但这对我来说似乎是唯一合适的解决方案。