我想让用户给服务器端的文件更名,具体做法是:
在一个使用了master的aspx页面上放置一个HyperLink控件与一个HiddenField控件,用户点击HyperLink控件,先执行一段客户端js,弹出一个对话框提示用户输入新文件名,确定后回送到服务器端更名。具体代码如下(无关的代码被我删了):master代码:
<head runat="server">
     <script type="text/javascript" src="/SchoolMaster.js"></script>
</head>
<body >
    <form id="Masterform" runat="server" method="post" enctype="multipart/form-data">   
        <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
        </asp:contentplaceholder>
    </form>
</body>aspx代码:
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">    
    
   <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="javascript:ReFilename()">HyperLink</asp:HyperLink>
    
   <asp:HiddenField ID="ReNameParam" runat="server" value=""/></asp:Content>SchoolMaster.js文件代码:
function ReFilename()
{
var fn =prompt("请输入新文件名","");
var obj=document.getElementById("ReNameParam");
obj.value=fn;
__doPostBack('MyLinkButton','');
}现在运行,点击HyperLink1,弹出对话框,提示输入新文件名。输完后,提示脚本出错,对于obj.value=fn这句提示obj不能是null,因此没有获取到隐藏字段对象。不知有哪位高手能解决?为此问题郁闷了好几天!!!!!
问题解决,立即结帖!!!

解决方案 »

  1.   

    想不通 为什么把JS放到 MasterPage页面里 为什么不放在Aspx页面中呢  试试吧
      

  2.   

    1.
    逻辑上设计的有问题master 当然无法访问 aspx 的东东将此隐藏域放在 .master 问题, 岂不全解决了,这里我已回复
    http://community.csdn.net/Expert/TopicView3.asp?id=56544932.
    确实要按楼主这样设计那么     a. 简单方法:硬编码
            运行一次目标 aspx 页面,查看其 html 源码, 找到目标隐藏域,你可以搜索 ReNameParam,次隐藏域,客户端呈现的应该类似
           <input type=hidden id=xxx_Content1_xxx_ReNameParam ....
          拷贝此客户端的真实 id 更新你的脚本代码
         
         b. 动态方法
           // .master.cs 实现一属性
            public string MyHiddenFieldClientIDFromAPX {
                  get { return (ViewState["MyHiddenFieldClientIDFromAPX"] == null) ? "" : (string)ViewState["MyHiddenFieldClientIDFromAPX"];
                  set { ViewState["MyHiddenFieldClientIDFromAPX"] = value; }
            }      // .master
          var obj=document.getElementById('<% =ViewState["MyHiddenFieldClientIDFromAPX"] %>');
          // .aspx.cs      ((MyMasterClass)Page.Master).MyHiddenFieldClientIDFromAPX = ReNameParam.ClientID;
      

  3.   

    var obj = document.getElementById("<%=ReNameParam.ClientID%>")
      

  4.   

    回xeppp():在aspx页面上放哪呢?源代码根本就没有<head></head>区域
      

  5.   

    回Jinglecat(晓风残月 >> 问题需简洁,错误要详细) :采用你的简单方法:硬编码,解决了!!!可我还想问一个问题,不管何人、何时请求该页面,HiddenField的id均是ctl00_ContentPlaceHolder1_ReNameParam?不会是其它的吗?部署到不同的服务器上呢?
      

  6.   

    回net_lover(【孟子E章】) :刚才试了一下你的办法,不行啊!
      

  7.   

    回xeppp():在aspx页面上放哪呢?源代码根本就没有<head></head>区域
    ========
    js 的 script 块并非一定要放在 head 区域
    可我还想问一个问题,不管何人、何时请求该页面,HiddenField的id均是ctl00_ContentPlaceHolder1_ReNameParam?不会是其它的吗?部署到不同的服务器上呢?=============是的,每个请求均是 ctl00_ContentPlaceHolder1_ReNameParam但是,这样不利于开发维护,比如,你更改了 ReNameParam 的 ID 为 ReNameParam911 那么你还是得同步更新你的 js 代码用我动态方法也是可以的事实上,将放在 js 放在 aspx 中任何地方都可以
      

  8.   

    不可能不行的。你使用的方法怎么用的?<script>
    var objID = "<%=ReNameParam.ClientID%>"
    </script>SchoolMaster.js文件代码:
    function ReFilename()
    {
    var fn =prompt("请输入新文件名","");
    var obj=document.getElementById(objID );
    obj.value=fn;
    __doPostBack('MyLinkButton','');
    }
    使用ClientID是最简单的方法
      

  9.   

    每个 ASP.NET 服务器控件同时具有 ID ClientID UniqueID 三个属性,
    关于这三个属性的区别、应用等相关讨论,可以参考此篇文章:关于 asp.net 服务器控件几个 ID 的说明 
    http://www.cnblogs.com/Jinglecat/archive/2007/04/28/730511.htmlHope helpful.
      

  10.   

    谢谢各位大侠!!!特别感谢Jinglecat(晓风残月 >> 问题需简洁,错误要详细) 、net_lover(【孟子E章】) 两位高手!!!
    我原以为javascript只能放在<head></head>中,所以套用了master的aspx页面的javascript只能放在master的head区,导致编程困难重重,今天经各位大侠指点,真有拔开云雾见青天的感觉!谢谢!!!!!!!!!!!!