ASP.NET中是否有本地方式来显示“成功消息”?

9

假设你有一个类似于ASP.NET ASP:DetailsView的控件,用于显示和编辑数据库中的单个记录。

添加验证和验证摘要以记录错误案例非常简单。当更新表单未通过验证时,它会自然地发出警告:显示验证消息和/或验证摘要。不需要任何代码后台。

但是,当您通过验证时,更新将完全静默。没有任何感觉发生了什么,并且似乎没有默认设置可以在没有代码后台的情况下生成成功消息。

但是,即使是代码后台也很困惑。哪个事件应该显示成功消息?onItemUpdate,对吗?好吧,但是假设您进行另一次更改并获得验证错误怎么办?您的成功消息将保留。我无法找到可靠关闭现有成功消息的事件(如果存在验证错误)。

这应该是Web开发的基础!为什么这么难?

编辑:

有人建议使用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;
}

一旦我成功更新了,但是似乎没有任何方法可以使那个消息消失,甚至无法通过验证来消除。

第二次编辑:

只想明确一下,我确实尝试在Page_Load中添加ClearMessages代码。然而,当我第二次点击更新且出现验证错误时,似乎没有任何方法可以使成功消息标签消失。有人能提供其他的故障排除提示吗?

4个回答

7
据我所知,没有本地的方法可以做到这一点。你可能会抱怨一下,也许微软会听到:)。
在 Page_Load 或者代码后台的其他位置上重置“成功消息”不起作用。这是因为 ASP.NET 验证通常在客户端和服务器端都进行。这意味着对于您在页面上放置的每个验证控件,ASP.NET 会生成一些客户端 Javascript 来进行验证,并在客户端上呈现错误,而不需要返回服务器。因此,您将同时面临成功消息和错误消息。
您可以怎么做:
- 在页面上放置一个
控件,它将显示出成功消息(正如其他人已经建议的那样)。每当您在服务器端代码中更新某些内容时,请显示该控件并设置有意义的“成功!”消息文本。 - 注册一个自定义 Javascript 函数,在每个页面提交时查找
并隐藏它。请注意,该函数需要在执行验证的自动生成客户端脚本之前调用。
如果查看 ASP.NET 页面(带有验证器)的客户端源代码,您可以找到以下内容:
WebForm_OnSubmit 是由 ASP.NET 生成的,并调用执行验证的 javascript。示例:
function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false)
    return false;
return true;
}

要注册自定义代码以隐藏成功消息,您应该在代码后端(code-behind)中放置类似以下内容的代码:
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时,或单击某个保存按钮,或其他任何操作),都会显示带有“成功”消息的div控件。在下一次回发之前,将清除此消息,然后将页面提交到服务器。当然,如果此回发也触发了“成功”,则服务器端的代码将再次显示该消息。如此反复。
我希望以上内容有所帮助。它不是完整的解决方案,但足以为您指明正确的方向。

天啊,这比我能想象的还要糟糕,但答案很棒。我想我也可以强制每次验证都返回服务器。你是个冠军。 - danieltalsky
另一个有用的提示是:您可以在主页面中完成上述所有操作(假设您使用ASP.NET 2.0)。也就是说,您可以将div控件放置在内容正上方,并在那里显示信息消息(继续...) - Dan C.
你在派生自MasterPage的对象中公开了一个SetMessage()公共方法,并且通过使用((MyMaster)Page.Master).SetMessage("Success"),你可以为使用该母版页的所有页面提供“信息消息”支持。 - Dan C.

1

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


我尝试过这个,但在第二次编辑触发验证失败时,标签似乎并没有真正变为不可见。 - danieltalsky
你启用了客户端验证吗?如果是这样,那么你需要使用JavaScript隐藏成功消息。 - tvanfosson

1
Daniel,我需要类似的东西,所以我从标签派生出来,直接将它绑定到各种DataSourceControl衍生类(LinqDataSource、ObjectDataSource、SqlDataSource)引发的事件上。我还使用客户端JavaScript在验证和/或表单提交期间隐藏标签(就像Dan.C的答案一样)。
该控件公开了成功删除、插入和更新事件的单独消息文本属性。
我已经发布了该解决方案的注释源代码,链接为http://codehq.net/files/UpdateSuccessMessage.zip
希望这可以帮助到你。

谢谢你的回答。我正在下载代码并审核它。我仍然没有实现任何东西,但我的用户开始要求这个功能了。我原本计划使用一种jQuery“淡出”解决方案,但我现在正在检查你的代码。 - danieltalsky

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 网站,我认为你需要熟悉代码后台:-)


我完全熟悉代码后台,但这是一个非常简单的Web应用程序,我做出了一个设计决策,尽可能使用本机ASP.NET标记。它很可爱,老实说,在此之前我从未编写过任何代码后台。 - danieltalsky
然而,遗憾的是,这并不能完成任务。 当我触发验证消息时,成功消息仍然存在。 我甚至尝试将EnableViewState关闭。 - danieltalsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接