如何从C#代码隐藏中调用Javascript?

如何从C#代码隐藏中调用Javascript?,javascript,c#,Javascript,C#,我知道答案到处都是,但我只是从桌面应用程序转向网络应用程序,目前的帖子对我来说就像希腊语 我的情况: 这是一个基于网络的许可证申请,供公司内部使用。起点是现有许可的网格,或者用户可以创建一个新的 许可证的生命周期中有四个状态,我必须考虑两个“条件”(页面的初始加载与数据库值,以及用户单击一个按钮以使许可证进入下一个状态)。 因此,在初始的OnLoad事件中,我为传递到页面的行ID获取db行(对于新许可证为null),并填充一些控件,通过根据db中存储的状态设置类属性来隐藏/显示某些。到目前为止我

我知道答案到处都是,但我只是从桌面应用程序转向网络应用程序,目前的帖子对我来说就像希腊语

我的情况:

这是一个基于网络的许可证申请,供公司内部使用。起点是现有许可的网格,或者用户可以创建一个新的

许可证的生命周期中有四个状态,我必须考虑两个“条件”(页面的初始加载与数据库值,以及用户单击一个按钮以使许可证进入下一个状态)。 因此,在初始的OnLoad事件中,我为传递到页面的行ID获取db行(对于新许可证为null),并填充一些控件,通过根据db中存储的状态设置类属性来隐藏/显示某些

。到目前为止我还不错

OnLoad不是静态的,所以所有这些魔法都是在C#code-behind中执行的(在这里,我比Javascript更容易编码)——有一个状态切换,我调用适当的方法使页面看起来像我需要的那样。我在这里也很好

现在乐趣开始了——用户从下拉列表中选择下一个状态并单击按钮。JavaScript拾取click事件并创建一个部分模型对象,该对象具有新状态和用户在文本框中输入的一些注释,然后传递给代码中的静态方法,在该方法中调用存储过程并更新一些db值。这是有效的

静态代码隐藏方法所做的最后一件事是创建一个JSON字符串响应,其中包含一些数据,基本上告诉页面更新是否成功,如果成功,Javascript将更新一些控件,并隐藏/显示
区域。
我的问题是为什么我的代码是两个独立的文件,做完全相同的事情?我不在乎是服务器还是客户机,我可以将方法放在一个文件中,在这两种情况下都可以调用吗

因为我对后面的代码比较熟悉,所以我从那里开始,但是因为我的AJAX调用是静态方法,所以我不能只调用我的C方法来执行页面加载时的隐藏/显示(因为它们实际上接触文本框/
控件,所以它们不能是静态的)

现在,我正在寻找如何将特定于各个状态的操作放入Javascript中,并在OnLoad()期间从我的switch(state)方法中的代码中调用它们

标准答案是“你不能从代码隐藏中调用Javascript”,但是每个人都展示了一个使用Register的例子。这个。那个(这里有一堆值),它们似乎都在代码隐藏中有按钮点击事件,而我的在Javascript中。我的事件实际上是OnLoad(),所以在理论上也是一样

如果这个注册的东西是我要寻找的答案,请不要只是粘贴一行代码,说这是答案。退后一步,解释一下发生了什么(我有一些示例代码,您可以将其添加到其中)

protectedvoid OnLoad()
{
//执行用户检查以查看用户拥有哪些权限
//分析现有rowID的传入页面
if(rowID==null)
{
//新许可证
SetVisualsForNewPermit();
}
其他的
{
var permit=DataClass.GetPermit(rowID);
开关(许可状态)
{
案例A:
SetVisualsPermitStateA(许可证);
打破
案例B:
SetVisualsPermitStateB(许可证);
打破
案例C:
SETVISUALPERMITSTATEC(许可证);
打破
}
}
}
受保护的字符串更新(PermitModel许可证)
{
//这里还有很多事情要做,
//但这是最基本的想法
尝试
{
var结果=DataClass.UpdatePermit(许可证);
返回JSON.ToString(结果);
}
捕获(例外情况除外)
{
返回JSON.ToString(例如Message);
}
}
私有无效设置VisualSPermitStateA(许可模型许可)
{
//说明有经济许可证,但没有批准
//设置一些文本框值
//使用批准人名称更新“某些”组合框
//显示第一个审批人的名称
//为第一个审批人启用“批准”和“拒绝”按钮
//隐藏其他区域
//**********************************************************************
*而不是在这里实际执行这些特定操作,
在这一点上,我是否可以调用Javascript,其中有一个方法可以执行这些完全相同的操作?
*想知道性能,由于服务器代码操作的所有不同控件,在这种方法中有多少网络流量在来回移动?对客户端进行一次调用并让客户端执行所有操作会减少流量吗?
}

如果将所有javascript作为一个完全不同的应用来考虑,您会做得更好。浏览器不知道或不关心使用什么后端堆栈来发送它所使用的内容(html、css、脚本、媒体等),而前端Javascript只知道它在处理这些资源的浏览器窗口环境中运行。当用于ajax之类的请求时,@charlietfl是正确的,javascript只知道发送/接收的位置和内容,而不知道另一端发生了什么。在这种情况下,您需要一个API Rest,以满足您的需求。您必须使用AJAX,发送端点(您的C#代码作为后端工作的地方),并期望在前端解析结果:)您如何进行AJAX调用?我一直在使用DevExpress,该工具使从代码隐藏中“调用”javascript变得非常容易(有一个客户端EndCallback事件,可以读取控件属性(比如从C#传递参数)。服务器端处理完成时将触发该事件。当您称为代码隐藏时,是否正在使用Web表单?如果是这种情况,您只需要调用Page.ClientScript.RegisterClientScriptBlock(Page.GetType(),“ScriptId”,“script”,bool表示是否添加脚本标记)
protected void OnLoad()
{
    // perform user checks to see what permissions the user has
    // parse incoming page for existing rowID
    if(rowID == null)
    {
    // new permit
    SetVisualsForNewPermit();
    }
    else
    {
      var permit = DataClass.GetPermit(rowID);
      switch(permit.State)
      {
        case A:
            SetVisualsPermitStateA(permit);
            break;
        case B:
            SetVisualsPermitStateB(permit);
            break;
        case C:
            SetVisualsPermitStateC(permit);
            break;
      }
    }
}

protected string UpdateState(PermitModel permit)
{
    // there is a lot more going on here,
    // but this is the basic idea
    try
    {
    var result = DataClass.UpdatePermit(permit);
    return JSON.ToString(result);
    }
    catch(Exception ex)
    {
    return JSON.ToString(ex.Message);
    }
}

private void SetVisualsPermitStateA(PermitModel permit)
{
    // state a means permit originated but has no approvals
    // set some textbox values
    // update the some combobox with approver names
    // show the <div> for first approver
    // enable both approve and reject button for first approver
    // hide other <div> areas
    //**********************************************************************
* instead of actually performing these specific actions here,
can I, at this point, make a call into the Javascript where there is a method that do these exact same actions?
* wondering about performance, how much network traffic is going back and forth in this method because of all of the different controls being manipulated from server code? Would it cut down on traffic to make one call to the client and have the client perform all of the manipulation?
}