繁体   English   中英

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

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

下面是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服务器上的终结点,要么必须发布从某种网页上获得价值。

ASP.NET解决方案

在服务器代码上注册您的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.NET示例。 我将其保留,并使用MVC ASP.NET示例更新答案。 下面的示例使用ajax.post来控制器触发函数调用并进行通信。

家庭控制器:

   [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()脚本函数,该脚本函数依次调用带有Controller Action详细信息的callAjax()函数-这是为了与控制器进行通信,以使控制器知道您期待一个令牌。 控制器中的SecureCall()从callAjax()获取发布请求,并返回令牌。 ajaxCallResult()处理您从控制器接收的结果数据,该控制器再使用解密的令牌值再次调用callAjax()函数,并调用控制器中的DecryptResult()。

基本上,您使用Ajax http post选项与Controller代码进行通信。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM