ASP.NET中是否有任何本地方式可以执行“成功消息”?

时间:2008-12-12 04:40:43

标签: asp.net c#-3.0 asp.net-2.0

假设您有类似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标签消失。任何人都可以建议任何其他疑难解答提示吗?

4 个答案:

答案 0 :(得分:7)

据我所知,没有本地方法可以做到这一点。你可能会咆哮,也许微软会听到它:)。

重置Page_Load上的“成功消息”或代码隐藏中的任何位置都不起作用。这是因为ASP.NET验证通常在客户端和服务器端完成。这意味着对于您放在页面上的每个验证控件,ASP.NET会生成一些客户端Javascript,它们会在客户端上执行验证并呈现错误,不带返回服务器。因此,您同时遇到了成功消息和错误消息。

你能做些什么:

  • 在您的页面上放置一个<div>控件,该控件将显示成功消息(如上面其他人已经建议的那样)。每当您更新某些内容(在服务器端代码中)时,请显示控件并设置有意义的“成功!”消息文本。
  • 注册一个自定义Javascript函数,该函数将查找<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)

Daniel,我需要类似的东西,所以我从Label派生并将其直接绑定到各种DataSourceControl派生(LinqDataSource,ObjectDataSource,SqlDataSource)引发的事件。我还使用客户端JavaScript在验证和/或表单提交期间隐藏标签(如Dan.C的答案)。

控件公开单独的消息文本属性,以便成功删除,插入和更新事件。

我已在http://codehq.net/files/UpdateSuccessMessage.zip

发布了解决方案的注释来源

希望这有帮助。

答案 2 :(得分:1)

使用ItemCommand事件并对每个给定的命令执行reset以清除状态。然后,如果验证在更新时失败,则将显示验证错误。如果成功,它将显示成功消息。随后,按钮单击将调用ItemCommand事件,您可以再次重置以重新开始。

答案 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网站,你需要得到代码支持恕我直言:-)

豫ICP备18024241号-1