如何在c#(mvc)的类方法中获取JavaScript函数的返回结果
本文关键字:获取 JavaScript 函数 结果 返回 类方法 mvc | 更新日期: 2023-09-27 18:15:19
下面是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选项与控制器代码通信。