ASP.NET一个目前无人能解决的问题。求解!!!
最近发现一个问题,ASP.NET中JS调用后台带参数的方法,一个目前无人能解决的问题。虽然可以使用Jquery的Ajax解决,但是出于好奇,还是决定把问题放在网上让大家一起帮忙解决。程序的意图如下:前台页面点击链接(<a>标记),通过链接的js单击事件调用后台带参数的C#方法。程序如下:1、前台页面
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
function a1_Click() {
var id = "1";//测试时使用,可赋其他值。
var text = '<%=SetText("'+id+'") %>';
$("#div1").html(text);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div id="div1">
</div>
<a id="a1" href="#" onclick="a1_Click()" >Click Me!</a>
</form>
</body>
</html>
js代码中的变量id是传递给后台代码的参数值,可以赋值为其他值日,用以进行测试。
2、后台C#代码:
public string SetText(string id )
{
string str = string.Empty;
if (id.Trim() == "1")
str = "1";
if (id.Trim() == "2")
str = "3";
if (id.Trim() == "3")
str = "3";
else
str = "null";
/*
if (id.Trim().Equals("1"))
str = "1";
if (id.Trim().Equals("2"))
str = "3";
if (id.Trim().Equals("3"))
str = "3";
else
str = "null";
*/
//Response.Write(id);//测试输入的参数id的值在服务器端输出
//Response.Write(str);//测试结果str的值在服务器端输出
//return id;//测试输入id
//return id.GetType().ToString();//测试返回变量id的类型
return str;
}
无论怎么弄,前台js调用后台方法后输出的都是null,也就是说后台方法的判断条件没有匹配的,最后执行的是else分支。测试输出后台方法中返回的id值,没有问题,测试在后台方法中用Response.Write()输出id和str,都没有问题。测试输出id的类型,为String。但是就是返回最后的结果str(return str)输出为null。也就是说条件判断中匹配了最后的else分支。希望各位高手能解释下这是什么原因。谢谢! --------------------编程问答-------------------- '<%=SetText("'+id+'") %>';
JS中不能识别这种语法的。。。大哥。。
你改成这样试试。。
--------------------编程问答-------------------- 这是我测试的。。
<a id="a1" href="#" onclick="a1_Click(<%=1%>)" >Click Me!</a>
<script type="text/javascript">
function a1_Click(o) {
var text = o;
$("#div1").html(text);
}
</script>
--------------------编程问答-------------------- JS要在客户端执行,服务器把所有的东西解析完之后再扔给浏览器的,不会计算JS代码。在SetText那里打个断点就知道了,传进来的参数是【' + id + '】,返回的当然是"null"。 --------------------编程问答-------------------- var text = '<%=SetText("'+id+'") %>';
<a id="a1" href="#" onclick="a1_Click(1)" >Click Me!</a>
<script type="text/javascript">
function a1_Click(o) {
var text = o;
//$("#div1").html(text);
alert(o);
}
</script>
会在页面加载的时候输出在客户端,而页面加载的时候,此时真正传给后台的参数其实是 "'+id+'",当后台接受该值时,因为和所有的匹配提交不符,所以进入else分支,从而返回null --------------------编程问答-------------------- 本身就是2个概念 1个服务端 1个客户端
var text = '<%=SetText("'+id+'") %>';
先net执行 SetText("'+id+'") 参数是 '+id+'
传到客户端浏览器 js执行 var text ='上面的值 就是你说的null'
还有 下次发帖子 标题别写的这么大... --------------------编程问答-------------------- 不过我倒是觉得你那个是可以实现,需要你把你的那段js,变成一个自定义控件
在页面加载的时候,你需要做一些翻译工作(类似asp.net翻译服务器控件到html一样),比如把你要写的变量及声明的变量都变成隐藏文本
把方法名和服务器完全一致(codehide)变成提交表单的js事件,然后在执行到那里的时候
比如var result=CallBack("1-0"); 注意CallBack是一个你要提供的提交服务器的方法,在自定义控件OnRender的时候提供,然后把这个CallBack("1-0");其中的"1-0"; 提交到服务器 用隐藏文本
客户端的提交如何到服务器的方法,只需要在服务端去相应post事件,然后你去通过反射执行自定义控件.Page的方法即可,传递那个隐藏文本的Object,服务器的约定方法后面会有说明,处理完成之后,要回发
到客户端
这个时候需要生成一个$(function(){
你之前客户端的方法(); 以便让他可以在回发之后的页面立即执行,注意这个也是需要做一些修改的,稍后说明
});
现在还有个问题,就是你后台的方法返回的值该如何给客户端,我觉得这个方法应该是个约定,比如是带参数的
如
public object CallBack(object value); 记住这个方法,一定要再次出发绑定事件,类似DataBind,因为自定义控件的OnRender生命周期已经结束
返回的object,可以直接输出到js变量里面,比如结果是1 直接var result=1; 其他poco类似
这样在前面那个初始化的方法中,就可以直接加入这个翻译的变量,,然后把这个变量和之前最开始的方法进行替换
比如之前是 var result=CallBack("1-0");注意这个是要被自定义控件翻译成一个提交事件的方法的
现在替换成var result=1;
然后就会继续执行下面的js方法,你的问题很有意思,希望能继续讨论
--------------------编程问答-------------------- 我可能写的有点乱,但是请详细读,我说的方法是可以满足你的这种想法的 --------------------编程问答--------------------
说的够清晰 --------------------编程问答-------------------- 我写的比较乱,主要意思就是
你需要把你要提交到的服务器的js约定方法,变成一个js提交的方法,这样你提交的CallBack("1-0");
function CallBack(value)
{
$("#hidetext").val(value);
$("form").submit()
}
就会被服务器接收到。
在自定义控件OnRender加入if(PostBack)的判断,用反射,找到Page的约定服务器方法(MethodInfo)比如
object CallBack(object value);
把刚才获取到客户端提交的方法,传给这个value,之后得出结果
然后需要在页面回发到客户端之后,立即执行你的js方法,就需要在OnRender里面
把你的自定义控件里面的方法进行翻译,把约定的CallBack("1-0");改为 刚才反射执行的方法,比如说是1
var result=CallBack("1-0"); 改为var result=1;
然后把咋个翻译过的js方法外面加上 $(function(){
})
让这个方法在页面一加载的时候就执行,就能回到你刚才的js执行里面了,注意这些都是在自定义控件OnRender里面操作
还有个问题就是你可能需要多个这个自定义控件在页面上,需要你以服务器ID来区别了
--------------------编程问答-------------------- 不是无人解决,而是这个问题已经无数次“解释原因”过了,实在懒得重复。
你了解asp.net页面生命周期吗?当网页输出html的时候(还没有到达浏览器端的时候),服务器端的网页对象已经销毁了。哪来的计算?那些计算都是在服务器生成html字符流之前进行的计算?难道你以为是浏览器上渲染时再在服务器上计算? --------------------编程问答-------------------- 你要分清服务端和客户端
你的问题只能通过ajax解决 --------------------编程问答--------------------
你要明白什么是ajax
--------------------编程问答-------------------- 看看10楼的回复很详细
补充:.NET技术 , ASP.NET