2009-12-09 64 views
1

我有一个包含播放列表的ListView。如果用户想要编辑一个专辑,他们点击编辑链接,它允许他们删除或添加歌曲到播放列表。如果用户想保留一个新的播放列表,同时保留原来的播放列表,则会单击另存为按钮。以下是应该发生的事情:如何以编程方式更改OnClientClick事件并调用它?

如果用户单击另存为并且他们没有更改名称,我想显示警告,告诉他们他们必须更改名称。

如果用户单击另存为并且他们更改了名称,我想显示一个他们确实想要保存它的确认。

目前发生的情况是,如果我在后面的代码中放置了类似以下内容的内容,则该脚本不会注册,直到第二次单击以及注册的任何脚本保持注册状态,这意味着如果最终更改了名称和警报脚本是之前注册的,它将显示警报而不是确认。下面是代码:

if (newname == oldname) 
{ 
    btnSaveAs.OnClientClick = 
    "javascript:alert('Save As requires you to change the name of the playlist. Please 
    change the name and try again.');"; 
} 
else 
{ 
    btnSaveAs.OnClientClick = "javascript:confirm('Are you sure you want to save the 
    playlist" + newname + "?');"; 
} 

我也尝试添加返回false,所以它不会做回传,但如果我这样做,那么它不实际上并不当我点击确认OK做任何事。

+0

Xaisoft,我在下面的答案中付出了相当多的努力。如果您发现它是正确和有用的,请确保您将其标记为答案。 – 2009-12-16 17:44:14

+0

对不起,我还没有机会测试它。我会稍微。一旦我做了,我会标记它。 – Xaisoft 2009-12-16 19:54:13

回答

5

SLaks说的是正确的,你误解了页面生命周期。在之前,您点击另存为,页面上的JavaScript代码需要放置到位。在上述示例中,用户对标题/名称进行了更改,然后单击另存为,然后将JavaScript代码应用于该按钮。第二次点击另存为时,弹出上一个示例的验证结果。

选项1:使用验证控制

解决这个最简单的方法是使用一个RegularExpressionValidator控件来比较值。

标记片段:

<asp:Label ID="lblName" runat="server" Text="Name: " /> 
<asp:TextBox ID="txtName" runat="server" /> 
<asp:RegularExpressionvalidator ID="valName" runat="server" ControlToValidate="txtName" ErrorMessage="You must change the name before saving" Display="Dynamic" /> 

<asp:Button ID="btnSaveAs" runat="server" OnClick="btnSaveAs_Click" Text="Save As" CausesValidation="True" /> 

在您的代码隐藏一旦表单字段(专辑名称等)结合,运行此:

valName.ValidationExpression = string.Format("[^{0}]", Regex.Escape(lblName.Text)); 

上述正则表达式将是有效的除了开始之外的任何输入。如果用户更改相册名称的文本,保存按钮将正确验证。如果他们不这样做,验证者会在页面上显示一条消息,说他们必须更改它。

然后处理OnClick事件保存按钮只为保存价值,因为如果网页被验证它只会火:

protected void btnSaveAs_Click(object sender, EventArgs e) 
{ 
    if (Page.IsValid) 
    { 
     //do you save actions as needed 
    } 
} 

您仍然可以使用您的确认框,你想要的,由做:

protected void Page_Load(object sender, EventArgs e) 
{ 
    btnSave.OnClientClick = "return confirm('Are you sure you wish to change the name?');"; 
} 

上面应该工作得很好。另一种方法是列举如下:

选项2:如果你想彻底做验证客户端使用客户端验证功能

,你可以但它会复杂得多。你需要做的是注册一个完全客户端验证功能。

在后面的代码Page_PreRender期间:

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    //define the script 
    string script = @" 

    function validateAlbumName(oldName, textBoxId) { 

     //get the textbox and its new name 
     var newName = document.GetElementById(textBoxId).value; 

     //compare the values 
     if (newName === oldName) { 
      //if the name hasn't changed, 
      alert('You must change the name of the album'); 
      return false; 
     } 

     return confirm ('Are you sure you want to save the playlist ' + newName); 
    } 

    "; 

    //register the client script, so that it is available during the first page render 
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "SaveAsValidation", script); 

    //add the on client click event, which will validate the form fields on click the first time. 
    btnSaveAs.OnClickClick = string.Format("return validateAlbumName('{0}','{1}');", txtAlbumName.Text, txtAlbumName.ClientID); 

} 

希望这有助于。上面可能有一些语法错误,因为我只是很快将它们扔在一起..

+1

我应该注意到,我绝对不是正则表达式大师,所以我上面的正则表达式可能有缺陷。这个概念虽然会起作用。另一种选择是使用带隐藏字段的asp:CompareValidator来跟踪旧值和新值。 – 2009-12-09 21:26:44

+0

你的正则表达式不正确;它将匹配任何不以任何字符开头的字符串。 – SLaks 2009-12-09 21:42:13

+0

如果我正在尝试访问ListView的ItemTemplate的TextBox,这仍然有效吗? – Xaisoft 2009-12-09 22:01:47

1

OnClientClick属性是一个Javascript字符串,而不是一个URI。因此,您不应该从javascript:开始。

为了处理confirm正确,写OnClientClick = "return confirm('Are you sure?');";

此外,你误会了ASP.Net页面模型。

你的C#代码隐藏事件处理程序只运行用户后点击按钮和的OnClientClick回调后。你需要用Javascript编写所有这些文件,并在OnClientClick中调用它。

+0

您能否详细说明您的意思“在OnClientClick中调用它”,并举例说明。谢谢。 – Xaisoft 2009-12-09 17:37:51

相关问题