[英]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服务器上的终结点,要么必须发布从某种网页上获得价值。
在服务器代码上注册您的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>
上面的只是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.