我有一个观点,我想在 jQuery 的 razor 变量中设置值。 我正在尝试这样
@{
ViewBag.Title = "Products";
Layout = "~/Views/Shared/_Layout.cshtml";
string ip_address = "";
}
<script type="text/javascript">
$(function () {
$.get("http://ipinfo.io", function (response) {
console.log("ip+" + response.ip);
'@ip_address' = response.ip;
}, "jsonp");
});
</script>
但这是抛出一个错误Uncaught ReferenceError: Invalid left-hand side in assignment
最佳答案
你想做的事情在技术上是不可能的 - 正如评论和其他答案已经指出的那样。
总结一下为什么这行不通,Razor 是一个 View 引擎,它使用在页面请求<时在服务器 上执行的 C# 代码/em> 以构建发送到客户端的 HTML 响应。
客户端没有对 Razor 变量的引用,并且 Razor View 引擎无法访问 JavaScript 变量 - 尽管它可以在脚本 block 内输出 JavaScript,该脚本 block 在页面加载时设置变量的初始值。
即使 JavaScript 可以访问 Razor 变量,它也只会在页面已传送到客户端设备(通俗地说是浏览器)上的用户代理时执行,而且太晚了 让您在此时进行任何条件渲染、显示/隐藏数据或安全检查,或在 View 中使用变量。
如果您只需要客户端 IP 地址,那么您已经可以通过 UserHostAddress propery of the Request object 在 Controller 中访问它.根据您想做什么,您可以通过 ViewBag 从 Controller 传递它到 View 并呈现它(“您的 IP 地址是...”),或者如果您出于安全目的使用它,请在 Controller 来过滤返回到 View 的操作,或者确定 View 是否应该呈现给用户(业务/领域逻辑通常不应在 View 本身内执行)。
这也意味着您不依赖于第三方服务 - 您的 Web 服务器必须知道请求页面的用户的 IP 地址,因为它使用此地址将响应发送回他们的浏览器。
如果您想要其他只能从浏览器确定的数据,例如页面呈现的“视口(viewport)”(浏览器窗口)的大小 - 您最好的选择是使用 Ajax 请求发送此数据到 No1_Melman 的回答中的 Controller 操作。
关于javascript - 在 jquery 的 razor 变量中设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25698574/