如何在c#(mvc)的类方法中获取JavaScript函数的返回结果

How to get return result of JavaScript function in method of class in c#(mvc)?

本文关键字:获取 JavaScript 函数 结果 返回 类方法 mvc      更新时间:2023-09-26

下面是JavaScript函数,我必须在c#中调用我的类方法。函数用于解密jwt令牌并返回结果。

JWS.verify = function(o, s, j) {
  //here return value can be Boolean, string, thrown error
};

现在,下面是c# (MVC)中的类方法

 public string Secure(string token)
    {
        //Here I want to call JavaScript function and get return result of java script
    }

我如何实现这个?提前感谢:)

c#不能调用JavaScript。JavaScript是一种脚本语言。它需要由运行时解析,运行时通常包含在浏览器中。除了使用Node.js之类的东西来设置无头服务器之外,JavaScript是运行在客户端,而所有的c#都是运行在服务器端。

如果情况是这样,你只能使用JavaScript来解密令牌,那么你要么必须使用Node,然后像c#中的WebClient这样的东西来访问Node服务器上的端点,或者你必须从某种网页上发回值。

网络解决方案

在你的服务器代码中注册你的javascript函数,需要时调用它,并在你的网页中有一个隐藏字段来存储返回值。从服务器代码中获取隐藏字段值。 c#

:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        ScriptManager.RegisterStartupScript(this, typeof(string), "callJavascript", "callJavascript();", true);
    }    
}
protected void Button1_Click(object sender, EventArgs e)
{
    Page.ClientScript.RegisterStartupScript(this.GetType(), "callJavascript", "callJavascript();", true);
    String token=HiddenField1.Value;
    Page.ClientScript.RegisterStartupScript(this.GetType(), "showReturn", "showReturn('" + token + "');", true);
}

网页(javascript):

<script language="javascript">
    /*This function gets called from Codebehind*/
    function callJavascript() {
        document.getElementById('<%= HiddenField1.ClientID %>').value = "Token Return value";
    }
    /* This function is just to show/test the return value*/
    function showReturn(token) {
        alert(token);
    }
</script>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" 
            Text="Call Javascript" />
        <asp:HiddenField ID="HiddenField1" runat="server" />
    </div>
    </form>
</body>

更新#1:ASP. NET MVC解决方案

上面的只是ASP。净的例子。我离开它是原样和更新MVC ASP的答案。净的例子。下面的示例使用ajax。Post到控制器触发函数调用并进行通信

HomeController:

   [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        [HttpPost]
        public ActionResult SecureCall(String param)
        {
            return Json("token123456");
        }
        [HttpPost]
        public ActionResult DecryptResult(String param)
        {
            return Json("OK Got the decrypted token:" + param);
        }
        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";
            return View();
        }
        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";
            return View();
        }
    }

索引页(Javascript):

<script language="javascript">
    function TriggerAction()
    {
        callAjax("SecureCall", "");
    }
    function DecryptToken(token) {
        return "54321nekot";
    }
    function ajaxCallResult(result, action)
    {
        if (action==="SecureCall")
        {
            var dtoken = DecryptToken(result);
            callAjax("DecryptResult", dtoken);
        }
        else if (action==="DecryptResult")
        {
            alert("Decrypt Result :"+result);
        }
        else if (action==="error")
        {
            alert("Error: "+action+" call failed!");
        }
    }
    function callAjax(action, param) {
        $.ajax({
            type: "POST",
            url: "/Home/"+action,    
            data: {param: param},
            success: function (result) {
                ajaxCallResult(result, action);
            },
            error: function (req, status, error) {
                ajaxCallResult("error", action);
            }
        });
    }
</script>
@{
    ViewBag.Title = "Home Page";
}
<p><a href="#" onclick="TriggerAction();" class="btn btn-primary btn-lg">Click here to trigger a Ajax call</a></p>

上面的例子将有一个链接在索引页,当你点击,调用TriggerAction()脚本函数,返回调用callAjax()函数与控制器动作的详细信息-这是启动与控制器通信,让控制器知道你正在期待一个令牌。控制器中的SecureCall()从callAjax()获取post请求,返回一个令牌。ajaxCallResult()处理从控制器接收的结果数据,该控制器再次调用callAjax()函数并解密令牌值,并且调用控制器中的DecryptResult()。

基本上,您使用Ajax http post选项与控制器代码通信。