从C#代码后面调用JavaScript

时间:2013-11-22 16:29:47

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

我正在尝试学习asp.net。假设我有这段代码:

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

如何从C#代码后面调用JavaScript?如何将JavaScript放在MS Visual Studio中默认创建的Scripts目录中?

enter image description here

4 个答案:

答案 0 :(得分:7)

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

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());
 }

答案 1 :(得分:1)

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

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

常规页面

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

Ajax Page

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

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

答案 2 :(得分:1)

通常这些“startupscripts”可以方便地翻译或将设置传递给javascript。 虽然迈克提供的解决方案在.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注入对象并在找到时覆盖它。

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

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

答案 3 :(得分:0)

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

c#代码页面

public string Name {get; set;} 

Aspx页面上的JavaScript

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

根据您的问题,填充到客户端通常更容易。只是一个想法!

相关问题