9

假设您有类似 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

4 回答 4

7

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

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

你可以做些什么:

  • 在您的页面上放置一个<div>控件,这将显示成功消息(正如上面其他人已经建议的那样)。每当您更新某些内容(在服务器端代码中)时,显示控件并设置一个有意义的“成功!” 消息文本。
  • <div>注册一个自定义 Javascript 函数,该函数将在每个提交页面时查找并隐藏它。请注意,需要在执行验证的自动生成的客户端脚本之前调用该函数。

如果您查看 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 按钮被单击时,或其他任何事情时),您将显示带有“成功”消息的 div 控件。在下一次回发时,就在将页面提交到服务器之前,此消息被清除。当然,如果这个回发也触发了“成功”,那么服务器上的代码隐藏会再次显示该消息。等等等等。

我希望以上内容有所帮助。这不是完整的解决方案,但它提供了足够的提示来为您指明正确的方向。

于 2008-12-12T07:48:25.047 回答
1

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

于 2008-12-12T04:48:55.157 回答
1

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

该控件为成功的 Deleted、Inserted 和 Updated 事件公开单独的消息文本属性。

我已经在http://codehq.net/files/UpdateSuccessMessage.zip上发布了解决方案的注释源

希望这可以帮助。

于 2008-12-14T12:18:34.767 回答
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 站点,您需要对代码背后的代码感到满意,恕我直言:-)

于 2008-12-12T05:15:07.383 回答