有没有一种方法可以从C#调用/运行JavaScript?

4
我有一个C#函数,我想在其中调用/运行一些JavaScript代码:
protected void DetailsView1_DataBound(object sender, EventArgs e) {
   ...
   // call/run JavaScript
   ...
}

我正在处理一个表单,具体来说是提交表单。点击“提交”后,会运行几个C#函数来处理验证和其他杂项任务。这些任务完成后,我需要运行一些JavaScript代码,但我在同步这些事件方面遇到了麻烦。JavaScript代码如下:

...
if (uploader.total.uploaded == 0) {
   if (uploader.files.length > 0) {
      uploader.start();
   }
   e.preventDefault();
}
...

我一直在尝试通过jQuery检测“提交”按钮的点击事件并运行我的Javascript来实现,但是表单本身并没有提交。我已经尝试了各种变化,但都没有成功。
那么我该如何实现呢?“RegisterClientScript”是我应该研究的东西吗?如果是,可能的解决方案是在PageLoad上注册JavaScript并将其附加到“提交”按钮上。如果是这样,我该如何在代码中实现呢?
如果需要进一步澄清我的问题,请告诉我。
更新:稍作说明...此页面上的表单是通过一个按钮提交的。
<asp:CommandField ValidationGroup="request" ButtonType="Image" 
        CancelText="Reset" CancelImageUrl="../images/internal/btn_reset.gif"
        InsertImageUrl="../images/internal/btn_insert.gif" ShowEditButton="True" 
        ShowInsertButton="True" />

这将创建两个按钮,其中"Insert"是提交按钮,因此我将其称为“Submit”按钮。

谢谢,
Hristo


C# 无法“运行”Javascript,因为它是客户端脚本,而C#在服务器端运行。如果您注册了客户端脚本,它将等待服务器完全响应后才会执行。这就是Web的工作原理。 - Josh Stodola
该死。那我该如何解决我的问题? - Hristo
C# 能运行 Java 吗?C# 能运行 COBOL 吗?英语能说西班牙语吗? - Carlos Muñoz
@Hristo,如果没有更多的澄清,我无法回答。 这个Javascript做什么?在Javascript执行之前/之后,C#需要做什么? - Josh Stodola
@Josh...如果你看一下我的更新,点击那个按钮会触发C#函数来处理提交表单(添加到数据库,保存服务器上的信息等等)。除此之外,我还需要上传文件至服务器,这就是JavaScript所做的。因此我需要找出一种方法,在用户点击提交按钮后上传这些文件。 - Hristo
@Josh 'C#不能“运行”Javascript':并不完全是这样:http://javascriptdotnet.codeplex.com/。但这很明显不是楼主想要的。 - jd.
7个回答

1

请参阅常见问题解答中的内容:

http://forums.asp.net/t/1360420.aspx#_How_to_register

private void Button2_Click(object sender, System.EventArgs e)
{
    string str;
    str="<script language='JavaScript'>";   
    str+="selectRange()";
    str+="<script>";
    Literal1.Text=str;
}

ASP.NET WebForms 的主要缺点是你必须接受 WebForm 模型——即在 C# 中执行所有逻辑,并让 WebForms 为你处理 JavaScript。这就是为什么你不得不像 FAQ 所说的那样进行扭曲。WebForms 的设计目的是使你的 Web 应用程序像桌面应用程序一样实现,但这并不总是有效。
ASP.NET MVC 的主要优点是你完全控制标记、JavaScript 等等。当然,缺点是你失去了使用 WebForms 的所有丰富内容控件的权限。然而,MVC 更符合大多数其他平台上的 Web 编程。

1
很遗憾,我不能进行转换,因为这不是我的决定。我只是试图在现有的糟糕结构中让事情正常运作。 - Hristo

1

是的,你应该使用RegisterStartupScript

像这样的代码应该在你的Click处理程序中起作用:

ClientScriptManager scriptManager = Page.ClientScript;
Type type = this.GetType();
string script = "<script type=text/javascript> callMyFunction(); </script>";

scriptManager.RegisterStartupScript(type, "MyName", script);

在上面的代码执行后,您的代码将继续执行,并将“控制”传递给C#,正如您所希望的那样。

除了函数调用之外,您还可以使用这个来注册它们,只需传递函数定义而不是调用它即可。


@Hristo 哦,我以为你想在按钮被点击时运行这段代码。无论如何,只要它在页面上,它应该可以工作。 - Smur
谢谢。有几个问题... Type type = this.GetType(); 是什么意思?最后一行代码是做什么的? - Hristo
@Hristo 这是要注册的启动脚本类型。最后一行将把您的脚本添加到页面中。如果您在脚本上放置一个函数调用,它将运行该函数。尝试使用上面的示例调用alert('Hi!')。 - Smur

0
如果你使用jQuery,你可以像这样从"submit"按钮中获取表单提交:
$("form").submit(function() {//do something, return true;}

"return true;" 将强制提交表单。如果返回 false(验证失败或其他原因),则表单将不会提交。


这在我的情况下部分有效。我捕获了事件并运行了我的js,但是表单没有被提交,所以我必须再次点击提交按钮才能进行实际提交。在捕获事件并运行我的代码后,我已经尝试过$('form').submit();,但没有成功。 - Hristo

0

一个例子可以是:

protected void DetailsView1_DataBound(object sender, EventArgs e)
{
    ...
    // Example JavaScript
    Response.Write("<script language='javascript'> { window.close();}</script>");
    ...
}

我不完全确定这是否是您想要的,但我以前用过这个。


0

我正在使用jQuery将表单提交到控制器。

这是我使用的代码。如果您有任何问题,请告诉我。

 $(function () {
        $('#form2').submit(function () {
            if ($("#txtServiceTypeCategoryName").val() == "") {
                alert("Please Enter Service Type Category Name");
                return false;
            }
            if ($("#txtServiceTypeCategoryDescription").val() == "") {
                alert("Please Enter Service Type Category Description");
                return false;
            }
            $('#someHiddenDiv1').show();
            $('#CCSave').attr('disabled', 'disabled');
            $('#btnExist').attr('disabled', 'disabled');
            $.ajax({
                url: this.action,
                type: this.method,
                data: $(this).serialize(),
                success: function (result) {
                    $('#someHiddenDiv1').hide();
                    $('#CCSave').removeAttr('disabled');
                    $('#btnExist').removeAttr('disabled');
                    window.location.href = '/ServiceTypeCategory/edit/' + $("#txtServiceTypeCategoryID").val();                  
                    //alert('ServiceTypeCategoryChanges Made Successfully!');
                }
            });
            return false;
        });
    });

0

听起来你不想让提交按钮触发服务器端请求,而是在客户端处理。在这种情况下,将提交按钮替换为普通按钮,并将onclick事件绑定到JavaScript代码。

以下是如何实现:

document.myform.mybutton.onclick(function(){ //在此处编写你的代码});


那么我该如何将控制权转回C#,以便表单能够正确提交? - Hristo
我不确定你想做什么,但是你可以使用JavaScript提交表单,方法是document.myform.submit(); 在执行JavaScript代码后这样做。 - jd.

0

正如你所提到的,你需要使用RegisterClientScriptBlock或者对于ajax来说,可以使用以下代码: ScriptManager.RegisterStartupScript(this, this.GetType(), "MyFunc", "MyFunc();", true);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接