【问题标题】:Invoke JavaScript from C# code behind [duplicate]从后面的 C# 代码调用 JavaScript [重复]
【发布时间】:2013-12-07 14:58:11
【问题描述】:

我正在努力学习 asp.net。假设我有这个代码:

if (command.ExecuteNonQuery() == 0)
    {
       // JavaScript like alert("true");
    }
    else
    {
        // JavaScript like alert("false");
    }

如何从后面的 C# 代码调用 JavaScript?如何通过将该 JavaScript 放在 MS Visual Studio 默认创建的 Scripts 目录中来做到这一点?

【问题讨论】:

  • 你不能从服务器端执行 javascript
  • 如果你是从 ASP.NET 开始的,我强烈建议你学习 ASP.NET MVC 而不是 Webforms,这是一种相当“古老”的技术,已经显示出它的局限性(Mircosoft 终于了解了 Web是无国籍的......)

标签: c# javascript asp.net .net visual-studio


【解决方案1】:

这是我将不时使用的方法,用于从后面的代码中发送弹出消息。我尽量避免这样做 - 但有时我需要这样做。

private void LoadClientScriptMessage(string message)
{
    StringBuilder script = new StringBuilder();

    script.Append(@"<script language='javascript'>");
    script.Append(@"alert('" + message + "');");
    script.Append(@"</script>");

    Page.ClientScript.RegisterStartupScript(this.GetType(), "messageScript",    script.ToString());
 }

【讨论】:

  • 你为什么尽量避免使用它?
  • 嗯,有时有更优雅的方法可以通过 ajax 将其保存在客户端。但如果我只需要弹出一个通知,这就是我使用的。
  • Aan > 警报只是 a** 中的一个痛点,它不应该用于用户界面...
  • 是的,我不同意这一点。一方面,我可以数出我不得不使用它的次数。
【解决方案2】:

您可以使用 RegisterStartupScript 从 CodeBehind 加载 javascript 函数。

请注意,只有当页面在客户端浏览器上呈现时,javascript 才会在客户端运行。

常规页面

Page.ClientScript.RegisterStartupScript(this.GetType(), "myfunc" + UniqueID, 
     "myJavascriptFunction();", true);

Ajax 页面

如果使用ajax,则需要使用ScriptManager。

ScriptManager.RegisterStartupScript(Page, Page.GetType(), "myfunc" + UniqueID, 
      "myJavascriptFunction();", true);

【讨论】:

    【解决方案3】:

    这可能是一个长镜头,但有时我需要来自服务器端的 c# 属性/值在客户端显示或操作。

    页面后面的c#代码

    public string Name {get; set;} 
    

    在 Aspx 页面上的 JavaScript

    var name = '<%=Name%>';
    

    填充到客户端通常更容易,具体取决于您的问题。只是一个想法!

    【讨论】:

      【解决方案4】:

      通常这些“启动脚本”对于翻译或将设置传递给 javascript 很方便。 尽管 Mike 提供的解决方案在 .Net 方面是正确的,但我怀疑在干净的(阅读:没有意大利面条代码)生产环境中这是一个很好的做法。最好将 .Net 变量添加到 javascript 对象中,如下所示:

      // GA example
      public static string GetAnalyticsSettingsScript()
      {
          var settings = new StringBuilder();
          var logged = ProjectContext.CurrentUser != null ? "Logged" : "Not Logged";
          var account = Configuration.Configuration.GoogleAnalyticsAccount;
      
          // check the required objects since it might not yet exist
          settings.AppendLine("Project = window.Project || {};");
          settings.AppendLine("Project.analytics = Project.analytics || {};");
          settings.AppendLine("Project.analytics.settings = Project.analytics.settings || {};");
          settings.AppendFormat("Project.analytics.settings.account = '{0}';", account);
          settings.AppendLine();
          settings.AppendFormat("Project.analytics.settings.logged = '{0}';", logged);
          settings.AppendLine();
      
          return settings.ToString();
      }
      

      然后使用普通的Page.ClientScript.RegisterStartupScript将其添加到HTML中。

      private void RegisterAnalyticsSettingsScript()
      {
          string script = GoogleAnalyticsConfiguration.GetAnalyticsSettingsScript();
          if (!string.IsNullOrEmpty(script))
          {
              Page.ClientScript.RegisterStartupScript(GetType(), "AnalyticsSettings", script, true);
          }
      }
      

      在 JavaScript 方面,它可能如下所示:

      // IIFE
      (function($){
          // 1. CONFIGURATION
          var cfg = {
              trackingSetup: {
                  account: "UA-xxx-1",
                  allowLinker: true,
                  domainName: "auto",
                  siteSpeedSampleRate: 100,
                  pluginUrl: "//www.google-analytics.com/plugins/ga/inpage_linkid.js"
              },
              customVariablesSetup: {
                  usertype: {
                      slot: 1,
                      property: "User_type",
                      value: "Not Logged",
                      scope: 1
                  }
              }
          };
      
          // 2. DOM PROJECT OBJECT
          window.Project = window.Project || {};
          window.Project.analytics = {
              init: function(){
                  // loading ga.js here with ajax
              },
              activate: function(){
                  var proj = this,
                      account = proj.settings.account || cfg.trackingSetup.account,
                      logged = proj.settings.logged || cfg.customVariablesSetup.usertype.value;
      
                  // override the cfg with settings from .net
                  cfg.trackingSetup.account = account;
                  cfg.customVariablesSetup.usertype.value = logged;
      
                  // binding events, and more ...
              }
          };
      
          // 3. INITIALIZE ON LOAD
          Project.analytics.init();
      
          // 4. ACTIVATE ONCE THE DOM IS READY
          $(function () {
              Project.analytics.activate();
          });
      }(jQuery));
      

      此设置的优点是您可以加载异步对象并通过 .Net 覆盖此对象的设置。使用配置对象,您可以直接将 javascript 注入对象并在找到时覆盖它。

      这种方法让我可以轻松获取翻译字符串、设置等... 这需要对两者都有一点了解。

      请注意,这种方法的真正威力在于“直接初始化”和“延迟激活”。这是必要的,因为您可能不知道(在页面加载期间)这些对象何时处于活动状态。延迟有助于覆盖正确的对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2019-09-06
        • 2011-12-02
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多