从jquery设置razor变量中的值

时间:2014-09-06 08:57:06

标签: javascript jquery asp.net-mvc razor

我有一个观点,我想从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

2 个答案:

答案 0 :(得分:4)

您想要做的事情在技术上是不可能的 - 正如评论和其他答案已经注意到的那样。

总结一下为什么这不起作用,Razor是一个视图引擎,它使用页面时服务器上执行的C#代码请求以构建HTML 响应,并将其发送到客户端

客户端没有引用Razor变量,并且Razor视图引擎无法访问JavaScript变量 - 尽管它可以在脚本块中输出JavaScript,该脚本块在页面加载时设置变量的初始值。

即使JavaScript可以访问Razor变量,它也只会在页面传递给客户端设备上的用户代理(以外行人的方式浏览器)时执行,并且太晚了< / strong>让您进行任何条件渲染,此时显示/隐藏数据或安全检查,或者在视图中使用变量。

如果您只想要客户端IP地址,那么您已经可以通过UserHostAddress propery of the Request object在控制器中访问该地址。根据您的目的,您可以通过ViewBag将其从控制器传递到视图并进行渲染(&#39;您的IP地址是......&#39;),或者如果您将其用于安全性目的是在控制器中使用它来过滤返回到视图的动作,或者确定是否应该向用户呈现视图(通常不应该在视图本身内执行业务/域逻辑)。

这也意味着您不依赖于第三方服务 - 您的网络服务器 知道请求该网页的用户的IP地址,因为它使用此服务将响应发送回他们的浏览器。

如果您想要其他只能通过浏览器确定的数据,例如&#34;视口&#34; (浏览器窗口)页面正在呈现 - 最好的办法是使用Ajax请求将其发送到控制器操作,如No1_Melman的答案。

答案 1 :(得分:1)

我想我已经明白你要做的事了。

我强烈地感觉到你还没有充分了解ASP.NET,还没有达到你想要的目标。所以我强烈建议您在codeprojectasp.net上阅读更多教程,以便您可以完全理解MVC框架以及如何使用它。

原始回复

如果您愿意,可以将该信息直接发布到您的服务器:

$(function () {
    $.get("http://ipinfo.io", function (response) {
        $.post("/MyController/Action", response);
    }, "jsonp");
}) 

Razor仅用于渲染输出。因此,一旦您在浏览器中查看该页面,它将与剃刀有ZERO关系,即没有与它进行交互。

我的代码没有加载部分代码,但是,一旦您加载了初始页面(触发到ipinfo的那个页面),您就可以使用JavaScript来呈现UI。我的代码使用jQuery将IP响应发布到MVC中的一个动作,所以在我的/MyController/Action中,你用/Home/_ProductList替换。顺便说一句,你不应该用&#34; _&#34;

为行动添加前缀

因此,根据您所说的,您希望加载部分内容,而不是操作,由于您编写的代码,评论会让我感到困惑。我将如何做到这一点:

@{
    ViewBag.Title = "Products";
    Layout = "~/Views/Shared/_Layout.cshtml";
    string ip_address = "";
}

@Html.Partial("_ProductList");

<script type="text/javascript">
    $(function () {
        $.get("http://ipinfo.io", function (response) {
            $.post("/MyController/Action", response.ip, function (successObj) {
                 // In here is where I set what ever in the partial

                 // I'm guessing that in the partial it renders some product table to view the products?
                 $.each(successObj, function (product) {

                    $("productTable").append(/* some new row using the product variable */);
                 });
             });            
               console.log("ip+" + response.ip);
        }, "jsonp");
    });
</script>