导航
  • 主页
  • .NET Framework
  • ASP
  • Web Services
  • .NET互联网桌面应用
  • VB
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • AppLauncher
  • 问答

怎么实现在服务器封装confirm? 涉及到服务器和客户端的传值和服务端的进程管理等问题...

nittystone 2005-06-06 03:14:33
需求是这样的,
当用户需要录入某一个对象时,
需要对用户进行确认操作,
这个操作是在服务端的c#代码里的。

普通的web程序可能都是js脚本实现很简单,
但在asp.net里由于之前的控件验证都是服务端的
最好还是在服务端实现
我是这么处理的
string script=@"<script>
function sureOver()
{
if(confirm('您确定要完成拟制任务吗?')==true)
__doPostBack('btnOverTask','');
}
</script>";
Page.RegisterClientScriptBlock("BeSure",script);
Page.RegisterStartupScript("msgOver","<script>sureOver();</script>");
return;

在btnOverTask事件里写,实际处理的代码
obj.Over();


这样实现的结果就是,代码太混乱。
如果能把这个confirm封装为服务端函数的话
这段代码就很清晰了
if (isConfirm("您确定要完成拟制任务吗?'"))
{
obj.Over();
}
所以就像把这个confirm封装成一个服务端的函数
public boolean isConfirm(string STR)
{
string script=@"<script>
function sureOver()
{
if(confirm(' " + STR + @"')==true)
__doPostBack('btnOverTask','');
}
</script>";
Page.RegisterClientScriptBlock("BeSure",script);
Page.RegisterStartupScript("msgOver","<script>sureOver();</script>");
//------------------------------------
//-----------------------------------
//---问题就在这儿出现了,用户点了confirm后,怎么把用户点的yes or no 的值
返回到这个函数的这个进程里,返回true or false?
}

因为这个confirm相关的各种验证判断都是服务器端的,所以这个提示才需要做成服务器的函数
不要建议我还说用javascript写了。
谢谢!
...全文
160 点赞 收藏 16
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
saucer 2005-06-07
there is some problem with my code, still the code is not very robust,

1. ClietnSideControls.cs


using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Web.UI.HtmlControls;

namespace ClientSideControls
{
[DefaultProperty("Text"),
ToolboxData("<{0}:ConfirmButton runat=server></{0}:ConfirmButton>")]
public class ConfirmButton : Button, INamingContainer
{
[Bindable(true), Category("Appearance"), DefaultValue("")]
public string PopupMessage
{
get
{
object popupMessage = this.ViewState["PopupMessage"];
if (popupMessage != null)
return this.ViewState["PopupMessage"].ToString();
else
return "Are you sure you want to continue?";
}

set
{
ViewState["PopupMessage"] = value;
}
}

public bool Confirmed
{
get
{
EnsureChildControls();
if (hid.Value.Length == 0)
{
object o = ViewState["Confirmed"];
if (o==null)
return false;
else return (bool)o;
}
else
{
ViewState["Confirmed"] = hid.Value=="true";
return hid.Value == "true";
}
}
}

bool bNeededToConfirm = false;

public bool ConfirmationAsked
{
get
{

object o = ViewState["ConfirmationAsked"];
if (o == null || (bool)o == false)
bNeededToConfirm = true;

ConfirmationAsked = true;

return !bNeededToConfirm;
}

set
{
ViewState["ConfirmationAsked"] = value;
}
}

public void Reset()
{
EnsureChildControls();
hid.Value = "";
ConfirmationAsked = false;
}

private HtmlInputHidden hid;

protected override void CreateChildControls()
{
hid = new HtmlInputHidden();
hid.ID = "ConfirmValue";
Controls.Add(hid);
}

protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);

if (bNeededToConfirm)
{
string script = String.Format(@"document.getElementById('{0}').value = confirm('%%POPUP_MESSAGE%%');", hid.ClientID);
script = script.Replace("%%POPUP_MESSAGE%%",
this.PopupMessage.Replace("\'", "\\\'"));

writer.AddAttribute(HtmlTextWriterAttribute.Onclick, script);

Page.RegisterStartupScript("DoingConfirm",String.Format("<script>document.getElementById('{0}').click();</script>",this.ClientID));
}

}

protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);

if (bNeededToConfirm)
{
hid.RenderControl(writer);
}
}

}
}



2. TestConfirma.aspx:
<%@ Register TagPrefix="cc" Assembly="ClientSideControls" Namespace="ClientSideControls" %>
<form runat="server">
<asp:Panel runat="server" id="Panel1">
<cc:ConfirmButton id="btn" runat="server" Text="Confirm" PopupMessage="Are you sure?" OnClick="Button_Click" />
</asp:Panel>
</form>
<script language="C#" runat="server">
void Page_Load(Object sender, EventArgs e)
{
Response.Write(DateTime.Now);
}

void Button_Click(Object sender, EventArgs e)
{
if (btn.ConfirmationAsked)
{
if (btn.Confirmed)
Response.Write("approved");
else
Response.Write("not approved");

btn.Reset(); //if you need to call it again, otherwise, the control will remember the last confirmation
}
//else don't do anything after this, probably including PreRender.....
}
</script>
回复
liuqinglq 2005-06-07
收藏....
回复
nittystone 2005-06-07
收到..

其实我们的需求就是把一个gui的ui层 改写成一个 bs系统。

想做这个的原因就是想做到最小的代码结构的改动,最大化的和gui的操作相同。

没想到这么繁琐。
回复
saucer 2005-06-07
验证应该是客户端和服务器端都要做的

一般的情形是,在客户端做必须做的那些验证,向用户确认后,在服务器端做同等验证(以防客户端disable javascript避过验证或用脚本提交),验证通不过,那么返回错误信息到客户端,要用户重新输入

这个表现层的验证通过后,在你业务层再做别的验证,如果通不过,那么返回错误信息到客户端,要用户重新输入,如果验证通过,那么理论上就不用再向用户确认了,如果你的业务要求一定要客户重新确认的话,一般的做法是把当前数据存起来,然后转向一个新的确认页。。。
回复
nittystone 2005-06-07
to saucer(思归)
感谢 , 大半夜给我码这么多字... :( ....
看了一下asp2.0的Script Callback 机制,
是否就是 实现了 客户脚本通过xmlhttp 调用服务器脚本返回数据的技术?

贴的控件代码已经收藏了,有时间调试一下。
但我这边的表单提交很复杂,,需要对页面元素的数据进行各种计算,根据计算的结果产生各种的提示确认信息,最后进行确认操作,您能否根据经验提供一种解决顺序?
就是这些验证放在服务器执行,返回客户端脚本进行确认好
还是在客户端脚本后台调用服务器程序计算,然后返回到客户端进行确认最后提交
还是有别的方法?
回复
nittystone 2005-06-07
提一下 看有没新的意见和想法就结贴
回复
saucer 2005-06-06
if you insist, try the following, although it is not robust and need some coding convention to make it work

1. ClientSideControls.cs
//code is based on the following article:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/aspnet-injectclientsidesc.asp

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Web.UI.HtmlControls;

namespace ClientSideControls
{
[DefaultProperty("Text"),
ToolboxData("<{0}:ConfirmButton runat=server></{0}:ConfirmButton>")]
public class ConfirmButton : Button, INamingContainer
{
[Bindable(true), Category("Appearance"), DefaultValue("")]
public string PopupMessage
{
get
{
object popupMessage = this.ViewState["PopupMessage"];
if (popupMessage != null)
return this.ViewState["PopupMessage"].ToString();
else
return "Are you sure you want to continue?";
}

set
{
ViewState["PopupMessage"] = value;
}
}

public bool Confirmed
{
get
{
EnsureChildControls();
return hid.Value == "true";
}
}

public bool ConfirmationAsked
{
get
{
EnsureChildControls();
return hid.Value.Length > 0;
}
}

public void Reset()
{
EnsureChildControls();
hid.Value = "";
}

private HtmlInputHidden hid;

protected override void CreateChildControls()
{
hid = new HtmlInputHidden();
hid.ID = "ConfirmValue";
Controls.Add(hid);
}

protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);

if (!ConfirmationAsked)
{
string script = String.Format(@"document.getElementById('{0}').value = confirm('%%POPUP_MESSAGE%%');", hid.ClientID);
script = script.Replace("%%POPUP_MESSAGE%%",
this.PopupMessage.Replace("\'", "\\\'"));

writer.AddAttribute(HtmlTextWriterAttribute.Onclick, script);
}
}

protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);

if (!ConfirmationAsked)
{
hid.RenderControl(writer);
}
}

}
}


2. TestConfirm.aspx:
<%@ Register TagPrefix="cc" Assembly="ClientSideControls" Namespace="ClientSideControls" %>
<form runat="server">
<asp:Panel runat="server" id="Panel1">
<cc:ConfirmButton id="btn" runat="server" Text="Confirm" PopupMessage="Are you sure?" OnClick="Button_Click" />
</asp:Panel>
</form>
<script language="C#" runat="server">
void Button_Click(Object sender, EventArgs e)
{
if (btn.ConfirmationAsked)
{
if (btn.Confirmed)
Response.Write("approved");
else
Response.Write("not approved");
}
//don't anything after this, probably including PreRender.....
}
</script>
回复
saucer 2005-06-06
你要理解, web application跟desktop application是很不相同的,起码现在是如此

你想要的

1。做用户输入的验证,如果输入有问题,则返回
2。如果输入没问题,向用户确认是否最后完成
3。调用完成方法

但第二步,需要到浏览器端执行,那么服务器端需要把HTML输出到浏览器,但也终止了你方法的执行

在浏览器里,一般是这么做的

1。用户按最后完成按钮后,向用户确认是否最后完成
2。做用户输入的验证,如果输入有问题,则返回
3。如果输入没问题,调用完成方法

btnSubmit.Attributes["onclick"] = "return confirm ('您确定要完成拟制任务吗?');";

如果你需要到后端在验证才能做最后确认,那么你需要采用某些类似Script Callback 机制,ASP.NET 2.0会有直接支持,ASP.NET1.* 中的实现参考

http://www.codeproject.com/aspnet/ScriptCallbackFramework.asp

http://msdn.microsoft.com/msdnmag/issues/04/08/CuttingEdge/
回复
nittystone 2005-06-06
回复人: LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^) ( ) 信誉:100 2005-06-06 17:31:00 得分: 0


http://www.codeproject.com/aspnet/AspNetMsgBox.asp


--------------------

你连接的文档解决我的问题了吗?
回复
LoveCherry 2005-06-06
http://www.codeproject.com/aspnet/AspNetMsgBox.asp
回复
nittystone 2005-06-06
confirm 返回false时 __doPostBack 个拒绝信息不久可以拉
----------------------------
这样就跳到别的服务器的进程里去了
我不能封装在一个 isConfirm函数里面。

怎么在 发出
if(confirm(' " + STR + @"')==true)
这个js脚本的服务器端代码的地方,获取到用户返回的yes or no,
就是我的这个问题!!

曾经尝试过用定时器等笨办法,都没有实现...

sauce 来了没有? 能否解决?

回复
luckyprg 2005-06-06
你上面不是给出代码了吗?
回复
confirm 返回false时 __doPostBack 个拒绝信息不久可以拉
回复
nittystone 2005-06-06
提一下
回复
nittystone 2005-06-06
简要的说就是
我们都会封装个alert

/// <summary>
/// 方法名称:alert
/// 内容摘要: 开发调试方便写的服务器端alert方法
/// </summary>
/// <param name="msg"></param>
protected void alert(string msg)
{
string strmsg=@"<script language='javascript'>
alert('" + msg + @"');
</script>";
this.Page.RegisterClientScriptBlock("alert",strmsg);
}

现在我想类似alert 封装一个confirm 怎么实现?
因为confirm 有个客户端的返回值
回复
zhouweiwansui 2005-06-06
不是很明白,但是我觉得不太可能吧
回复
发动态
发帖子
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
社区公告
暂无公告