Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP菜单:如何避免回发并使用Javascript客户端脚本访问选定值_Javascript_C#_Jquery_Webforms_Postback - Fatal编程技术网

ASP菜单:如何避免回发并使用Javascript客户端脚本访问选定值

ASP菜单:如何避免回发并使用Javascript客户端脚本访问选定值,javascript,c#,jquery,webforms,postback,Javascript,C#,Jquery,Webforms,Postback,我必须实现一种从ASP水平菜单(使用配置文件生成)中选择值的方法。菜单的生成不是一个问题:我的实际问题是找到一种方法,让用户在不使用回发的情况下访问其值 我正在处理一个大而旧的项目,该项目的编码意图是根本不使用回发请求回发是设计上意外的,被认为是错误 为了达到我的目标,我尝试为以return false结尾的MenuItemClick事件编写一个JavaScript触发器,以避免回发(出于测试目的,目前JavaScript代码仅限于一个简单的测试警报和假返回)。但这不起作用:我无法让事件触发Ja

我必须实现一种从ASP水平菜单(使用配置文件生成)中选择值的方法。菜单的生成不是一个问题:我的实际问题是找到一种方法,让用户在不使用回发的情况下访问其值

我正在处理一个大而旧的项目,该项目的编码意图是根本不使用回发请求回发是设计上意外的,被认为是错误

为了达到我的目标,我尝试为以return false结尾的MenuItemClick事件编写一个JavaScript触发器,以避免回发(出于测试目的,目前JavaScript代码仅限于一个简单的测试警报和假返回)。但这不起作用:我无法让事件触发JavaScript函数:发生回发,这是不希望的

完整的代码由数千行组成(其中大部分与问题无关),这里是一个只有相关行的简略版本:

Default.aspx:

<%@ Register TagPrefix="CRB" Namespace="ConfigurableReportBuilder.PageControls" Assembly="ConfigurableReportBuilder" %>
<form id="form1" class="page" runat="server">    
    <CRB:HorizontalMenu ID="MainMenu" runat="server" RootNode="Menu/Items" StyleClass="ui-menu ui-state-hover"/>
    //this works fine, no issue here.
</form>
Workspace.js:

var WS = (function ($) {
    var test = function (event) {
        alert("test"); 
        return false; //prevent postback
    };
    (...)
    return {// This dictionary contains references to public methods used in the project
        test: test,
        (...)
    }
}

$(document).on("menuitemclick", '#MainMenu', WS.test); //setting the event trigger

我已经找到了一个能够达到预期目标的解决方案,但是请注意,它不尊重良好的编码实践。可能有更好的解决方案,但我找不到

其想法是放弃基于事件的MenuItemClick逻辑,恢复到ASP菜单的默认行为,将URL作为可单击菜单项(NavigateUrl)。URL将在主页中无需任何回发即可访问,因此可用于承载信息。。。作为小JavaScript代码

为此,必须在菜单项初始化期间将原始Javascript代码设置为NavigateUrl参数:

protected MenuItem getMenuItem(XmlNode menuNode)
{//function that initialize a MenuItem with an XML node as parameter

    MenuItem mi = new MenuItem(); //creating a MenuItem object

    //Assigning its properties: 
    mi.Text = menuNode.Attributes["text"].Value; 
    if (menuNode.Attributes["description"] != null)
        mi.ToolTip = menuNode.Attributes["description"].Value;
    if (menuNode.Attributes["configfile"] != null) {
        mi.Value = menuNode.Attributes["configfile"].Value;
        mi.NavigateUrl = "javascript:alert('"+mi.Value+"');"; //Note that this isn't an URL
    }
}
因此,ASP菜单中的URL不是链接,而是将由在主页中执行的函数,而不经过任何事件。因此,这些函数可以用于检索所需的值,而无需执行任何回发事件:在我刚才给出的示例中,一个警报窗口显示所选的下拉值

protected MenuItem getMenuItem(XmlNode menuNode)
{//function that initialize a MenuItem with an XML node as parameter

    MenuItem mi = new MenuItem(); //creating a MenuItem object

    //Assigning its properties: 
    mi.Text = menuNode.Attributes["text"].Value; 
    if (menuNode.Attributes["description"] != null)
        mi.ToolTip = menuNode.Attributes["description"].Value;
    if (menuNode.Attributes["configfile"] != null) {
        mi.Value = menuNode.Attributes["configfile"].Value;
        mi.NavigateUrl = "javascript:alert('"+mi.Value+"');"; //Note that this isn't an URL
    }
}