我有一个包含播放列表的ListView。如果用户想要编辑相册,他们会单击编辑链接,并允许他们删除或添加歌曲到播放列表。如果用户想要在保留原始播放列表的同时保存新播放列表,则会单击“另存为”按钮。以下是应该发生的事情:
如果用户点击“另存为”并且他们没有更改名称,我想显示一条警告,告诉他们必须更改名称。
如果用户点击“另存为”并且他们更改了名称,我想显示他们确实要保存的确认信息。
目前,正在发生的事情是,如果我在后面的代码中放入类似下面的内容,则脚本在第二次单击之前不会注册,并且注册的任何脚本都会保持注册状态,这意味着如果我最终更改名称和警报脚本之前已注册,它将显示警报而不是确认。这是代码:
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 + "?');";
}
我也尝试添加return false,因此它不会进行回发,但如果我这样做,那么当我在确认单击OK时,它实际上并没有做任何事情。
答案 0 :(得分: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 :(得分:1)
OnClientClick
属性是Javascript字符串,而不是URI。因此,您不应该使用javascript:
开始。
要正确处理confirm
,请写下OnClientClick = "return confirm('Are you sure?');";
另外,你误解了ASP.Net页面模型。
您的C#代码隐藏事件处理程序仅在用户单击按钮后运行 OnClientClick
回调后运行。您需要在Javascript中编写所有内容并在OnClientClick
中调用它。