假设您有类似ASP.NET ASP的内容:DetailsView用于显示和编辑数据库中的单个记录。
记录错误案例很简单...您添加验证和验证摘要。当您的更新表单验证失败时,它会自然产生噪音:它会显示验证消息和/或验证摘要。不需要一个代码。
但是,然后,您通过了验证,它使您的更新完全无声。没有任何意义发生任何事情,似乎没有任何默认设置可以在没有代码隐藏的情况下制作成功消息。
但是,即使是代码隐藏也令人困惑。什么事件应该显示成功消息? onItemUpdate,对吧?很好,但是让我们说你做了另一个改变并得到验证错误?您的成功消息仍然存在如果存在验证错误,我无法找到可靠地关闭现有成功消息的事件。
这应该是web开发101!为什么这么难?
修改
有人建议使用ItemCommand事件......我尝试了这个和许多其他事件,但成功消息不会消失。这是一些代码。
我在ASP.NET中的消息
<label id="successMessage" class="successMessage" runat="server"></label>
我的DataView标签(简化):
<asp:DetailsView
Id="EditClient"
DataKeyNames="LicenseID"
DataSourceID="MySource"
runat="server"
OnItemUpdated="SuccessfulClientUpdate"
OnItemCommand="ClearMessages">
而且,我的代码隐藏:
protected void SuccessfulClientUpdate(object sender, DetailsViewUpdatedEventArgs e)
{
successMessage.InnerText = string.Format("Your changes were saved.");
successMessage.Visible = true;
}
protected void ClearMessages(object sender, DetailsViewCommandEventArgs e)
{
successMessage.InnerText = string.Empty;
successMessage.Visible = false;
}
然而,一旦我成功更新,似乎没有任何消息消失,甚至没有验证失败。
第二次编辑:
只是想明确我确实尝试将ClearMessages代码放在Page_Load中。但是,当我在第二次更新时遇到验证错误,似乎没有任何东西使successMessage标签消失。任何人都可以建议任何其他疑难解答提示吗?
答案 0 :(得分:7)
据我所知,没有本地方法可以做到这一点。你可能会咆哮,也许微软会听到它:)。
重置Page_Load上的“成功消息”或代码隐藏中的任何位置都不起作用。这是因为ASP.NET验证通常在客户端和服务器端完成。这意味着对于您放在页面上的每个验证控件,ASP.NET会生成一些客户端Javascript,它们会在客户端上执行验证并呈现错误,不带返回服务器。因此,您同时遇到了成功消息和错误消息。
你能做些什么:
<div>
控件,该控件将显示成功消息(如上面其他人已经建议的那样)。每当您更新某些内容(在服务器端代码中)时,请显示控件并设置有意义的“成功!”消息文本。<div>
并在每个提交的页面上隐藏它。请注意,需要在执行验证的自动生成的客户端脚本之前调用该函数。如果您查看ASP.NET页面的客户端源代码(包含验证器),您可以找到以下内容:
<form name="aspnetForm" method="post" action="MyPage.aspx" onsubmit="javascript:return WebForm_OnSubmit();id="aspnetForm">
WebForm_OnSubmit由ASP.NET生成并调用执行验证的javascript。样品:
function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false)
return false;
return true;
}
要注册隐藏成功消息的自定义代码,您应该(在代码隐藏中)放置以下内容:
if (!Page.ClientScript.IsOnSubmitStatementRegistered("ClearMessage"))
{
string script = @"document.getElementById('" +
yourDivControl.ClientID + "').style.display='none'";
Page.ClientScript.RegisterOnSubmitStatement(Page.GetType(), "ClearMessage", script);
}
这会将您网页的自动生成的WebForm_OnSubmit变为以下内容:
function WebForm_OnSubmit() {
document.getElementById('ctl00_yourDivControl').style.display='none';
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false)
return false;
return true;
}
效果: 在每次回发时(例如,当触发ItemCommand,或者单击某个Save按钮或其他任何内容时),您将显示带有“success”消息的div控件。在下一个回发中,在将页面提交到服务器之前,此消息将被清除。当然,如果此回发也触发“成功”,则服务器上的代码隐藏再次显示该消息。依此类推。
我希望以上内容对您有所帮助。这不是完整的解决方案,但它提供了足够的提示,使您指向正确的方向。
答案 1 :(得分:1)
使用ItemCommand事件并对每个给定的命令执行reset以清除状态。然后,如果验证在更新时失败,则将显示验证错误。如果成功,它将显示成功消息。随后,按钮单击将调用ItemCommand事件,您可以再次重置以重新开始。
答案 2 :(得分:1)
Daniel,我需要类似的东西,所以我从Label派生并将其直接绑定到各种DataSourceControl派生(LinqDataSource,ObjectDataSource,SqlDataSource)引发的事件。我还使用客户端JavaScript在验证和/或表单提交期间隐藏标签(如Dan.C的答案)。
控件公开单独的消息文本属性,以便成功删除,插入和更新事件。
我已在http://codehq.net/files/UpdateSuccessMessage.zip
发布了解决方案的注释来源希望这有帮助。
答案 3 :(得分:0)
为什么不在Page_Load中关闭验证消息。我假设如果发回邮件,你想要删除邮件,所以要确保它总是关闭。或者通过在标记(aspx页面)中设置EnableViewState =“False”来禁用控件的视图状态。
所以:
protected void ClearMessages(object sender, DetailsViewCommandEventArgs e)
{
successMessage.InnerText = string.Empty;
successMessage.Visible = false;
}
变为:
protected void Page_Load(object sender, EventArgs e)
{
successMessage.InnerText = string.Empty;
successMessage.Visible = false;
}
另外作为旁注,如果你建立.net网站,你需要得到代码支持恕我直言:-)