当前位置:编程学习 > C#/ASP.NET >>

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>
--------------------编程问答-------------------- 这是我测试的。。


<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>

--------------------编程问答-------------------- JS要在客户端执行,服务器把所有的东西解析完之后再扔给浏览器的,不会计算JS代码。在SetText那里打个断点就知道了,传进来的参数是【' + id + '】,返回的当然是"null"。 --------------------编程问答--------------------  var text = '<%=SetText("'+id+'") %>';

会在页面加载的时候输出在客户端,而页面加载的时候,此时真正传给后台的参数其实是 "'+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方法,你的问题很有意思,希望能继续讨论


--------------------编程问答-------------------- 我可能写的有点乱,但是请详细读,我说的方法是可以满足你的这种想法的 --------------------编程问答--------------------
引用 5 楼  的回复:
本身就是2个概念 1个服务端 1个客户端  
var text = '<%=SetText("'+id+'") %>';

先net执行 SetText("'+id+'") 参数是 '+id+'

传到客户端浏览器 js执行 var text ='上面的值 就是你说的null'

还有 下次发帖子 标题别写的这么大...


说的够清晰 --------------------编程问答-------------------- 我写的比较乱,主要意思就是

你需要把你要提交到的服务器的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解决 --------------------编程问答--------------------
引用 10 楼  的回复:
不是无人解决,而是这个问题已经无数次“解释原因”过了,实在懒得重复。

你了解asp.net页面生命周期吗?当网页输出html的时候(还没有到达浏览器端的时候),服务器端的网页对象已经销毁了。哪来的计算?那些计算都是在服务器生成html字符流之前进行的计算?难道你以为是浏览器上渲染时再在服务器上计算?

你要明白什么是ajax
--------------------编程问答-------------------- 看看10楼的回复很详细
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,