有没有办法从C#调用/运行JavaScript?

有没有办法从C#调用/运行JavaScript?,c#,javascript,asp.net,C#,Javascript,Asp.net,我有一个C#函数,我想在其中调用/运行一些JavaScript: protected void DetailsView1_DataBound(object sender, EventArgs e) { ... // call/run JavaScript ... } 我在处理一张表格,特别是提交表格。单击“提交”后,将运行多个C#函数,负责验证和其他杂项任务。完成这些之后,我需要运行一些JavaScript,但是我在同步这些事件时遇到了问题。JavaScript是: ...

我有一个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并将其附加到Submit按钮吗?如果是这样,我将如何在代码中执行此操作

如果我需要进一步澄清我的问题,请告诉我

更新 有点澄清。。。此页面上的表单通过按钮提交:

<asp:CommandField ValidationGroup="request" ButtonType="Image" 
        CancelText="Reset" CancelImageUrl="../images/internal/btn_reset.gif"
        InsertImageUrl="../images/internal/btn_insert.gif" ShowEditButton="True" 
        ShowInsertButton="True" />

这将创建2个按钮,插入是提交按钮,因此我将其称为提交按钮

谢谢,

Hristo

听起来您不希望单击submit按钮触发服务器端请求,而是希望在客户端处理。在本例中,将submit按钮替换为常规按钮,并将onclick事件绑定到JavaScript代码

这是你可以做到的

document.myform.mybutton.onclick(function(){//your code here})

请参见常见问题解答:

private void按钮2\u单击(对象发送者,System.EventArgs e)
{
字符串str;
str=“”;
str+=“selectRange()”;
str+=”;
Literal1.Text=str;
}
ASP.NET WebForms的主要缺点是您必须购买WebForm模型,即使用C#完成所有逻辑,并让WebForms为您处理JavaScript。这就是为什么你必须像FAQ告诉你的那样采取扭曲手段。WebForms旨在使您的web应用程序像桌面应用程序一样实现,但这并不总是很好


ASP.NET MVC的主要优点是您可以完全控制标记、JavaScript等。当然,缺点是您无法访问WebForms中的所有丰富内容控件。但是,MVC更适合大多数其他平台上的web编程。

如果使用jQuery,您只需通过“提交”按钮捕获表单提交,如下所示:

$("form").submit(function() {//do something, return true;}
“return true;”将强制表单提交。如果返回false(验证失败或其他情况),则表单将不会提交。

是。你应该使用

这样的代码应该适用于单击处理程序:

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

scriptManager.RegisterStartupScript(type, "MyName", script);
ClientScriptManager scriptManager=Page.ClientScript;
Type Type=this.GetType();
string script=“callMyFunction();”;
RegisterStartupScript(键入“MyName”,script);
在上面的代码执行之后,您的代码将继续执行,“将控制权”传递给C#,正如您所希望的那样

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

例如:

protected void DetailsView1_DataBound(object sender, EventArgs e)
{
    ...
    // Example JavaScript
    Response.Write("<script language='javascript'> { window.close();}</script>");
    ...
}
protectedvoid DetailsView1_数据绑定(对象发送方,事件参数e)
{
...
//示例JavaScript
Write(“{window.close();}”);
...
}

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

我使用jquery将表单提交给controller

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

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

正如您所提到的,您需要使用RegisterClientScriptBlock或类似于以下内容的ajax:
ScriptManager.RegisterStartupScript(this,this.GetType(),“MyFunc”,“MyFunc();”,true)

C#无法“运行”Javascript,因为这是客户端脚本,C#在服务器端运行。如果注册客户端脚本,则在服务器给出完整响应之前,它不会执行。这就是网络。那么我该如何解决我的问题呢?C#能运行Java吗??C#能运行COBOL吗???英语能说西班牙语吗?@Hristo没有进一步澄清,我无法回答。这个Javascript做什么?C#在Javascript执行之前/之后需要做什么?@Josh。。。如果查看我的更新,单击该按钮将触发负责提交表单(添加到数据库、在服务器上保存信息等)的C#函数。除此之外,我还需要将文件上传到服务器,这就是JavaScript所做的。因此,我需要找出一种方法,在用户单击“提交”按钮后上载这些文件。然后,我如何将控制权转移回C#,以便表单正确提交?我不确定您想做什么,但您可以使用JavaScript和document.myform.Submit()提交表单。在执行JavaScript代码之后再这样做。在我的情况下,这部分是有效的。我捕获事件并运行js,但是表单没有提交,因此我必须再次单击提交按钮才能进行实际提交。我已经尝试了$('form')。submit();捕获事件并运行我的代码后。不走运。不幸的是,我不能做出改变,因为这不是我的决定。我只是想用现有的、糟糕的结构来工作。@Hristo哦,我以为你想在点击一个按钮时运行这段代码。不管怎样,只要它在页面上,无论你把它放在哪里,它都应该工作。。。谢谢有几个问题。。。什么是
Type Type=this.GetType()最后一行做什么?@Hristo这是要注册的启动脚本的类型。最后一行将向页面添加脚本。如果对脚本进行函数调用,它将运行该函数。尝试使用上述示例调用alert('Hi!')。
 $(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;
        });
    });