如何将值从javascript变量传递给razor变量?

时间:2015-02-04 08:55:42

标签: javascript c# razor

如何将值从javascript变量传递给razor变量,是否可能是asp.net mvc razor视图引擎?

@{
    int a = 0;
}

<script>
    var b = ...
    @a = b;
</script>

8 个答案:

答案 0 :(得分:46)

你做不到。原因是他们不是在同一时间“活着”。 Razor变量是“服务器端变量”,在页面发送到“客户端”后它们不再存在。

当服务器获得视图请求时,它会创建仅包含HTML,CSS和Javascript代码的视图。没有C#代码,它们都被“翻译”为客户端语言。

当视图仍然在服务器上时,Javascript代码存在,但它没有意义,只能由浏览器执行(客户端再次)。

这就是为什么你可以使用Razor变量来改变HTML和Javascript但反之亦然。尝试查看您的页面源代码(大多数浏览器中的CTRL + U),那里没有C#代码的迹象。

简而言之:

  1. 服务器收到请求。

  2. 服务器创建“获取”视图,计算并将视图中嵌入的所有C#代码转换为CSS,Javascript和HTML。

  3. 服务器将视图的客户端版本作为对请求的响应返回给浏览器。
  4. 浏览器呈现页面并执行所有Javascripts

答案 1 :(得分:34)

但如果使用一个代替@ html.Hidden字段中的变量,则有可能。 如本例所示。

@Html.Hidden("myVar", 0);

为每个脚本设置字段:

<script>
function setMyValue(value) {
     $('#myVar').val(value);       
}
</script>

我希望我至少可以提供不小的解决方法。

答案 2 :(得分:1)

好的,所以这个问题很老......但我想做类似的事情,我发现了一个适合我的解决方案。也许它可以帮助别人。

我有一个List<QuestionType>,我填写下拉列表。我想将该选择放入我在表单中创建的QuestionType对象的Question属性中。我使用Knockout.js进行选择绑定。当用户选择一个时,这会将self.QuestionType knockout observable属性设置为QuestionType对象。

<select class="form-control form-control-sm"
    data-bind="options: QuestionTypes, optionsText: 'QuestionTypeText', value: QuestionType, optionsCaption: 'Choose...'">
</select>

我有一个隐藏字段来保存这个对象:

@Html.Hidden("NewQuestion.QuestionTypeJson", Model.NewQuestion.QuestionTypeJson)

在observable的订阅中,我将隐藏字段设置为对象的JSON.stringify版本。

self.QuestionType.subscribe(function(newValue) {
    if (newValue !== null && newValue !== undefined) {                       
        document.getElementById('NewQuestion_QuestionTypeJson').value = JSON.stringify(newValue);
    }
});

Question对象中,我有一个名为QuestionTypeJson的字段,当用户选择问题类型时,该字段将被填充。我使用此字段来获取QuestionType对象中的Question,如下所示:

public string QuestionTypeJson { get; set; }

private QuestionType _questionType = new QuestionType();
public QuestionType QuestionType
{
    get => string.IsNullOrEmpty(QuestionTypeJson) ? _questionType : JsonConvert.DeserializeObject<QuestionType>(QuestionTypeJson);
    set => _questionType = value;
}

因此,如果QuestionTypeJson字段包含某些内容,则会对其进行反序列化并将其用于QuestionType,否则它只会使用支持字段中的内容。

我基本上已经过了&#39;不使用RazorAjax调用的模型的JavaScript对象。您可以在不使用Knockout.js的情况下执行与此类似的操作,但这就是我正在使用的内容......

答案 3 :(得分:0)

我发现前一段时间已经讨论过这个问题,但是如果有人再次见到这个问题,这是我的解决方案:

在* .cshtml查看文件中:

KeyEvent.VK_FINAL

JavaScript变量模型是我需要传递给Razor ViewModel的东西。 它可以使用ajax请求完成。 你只需要在你的动作中有适当的参数,它与JavaScript中创建的Json对象相匹配。

希望它能帮助别人!

答案 4 :(得分:0)

步骤:1你的Html, 首先使用javascript将值存储在localstorage中然后添加如下所示的行,这是你要在html中显示值的地方,我的例子基于boostrap:

<label for="stringName" class="cols-sm-2 control-
label">@Html.Hidden("stringName", "")</label>

步骤:2 Javascript

 $('#stringName').replaceWith(localStorage.getItem("itemName"));

答案 5 :(得分:0)

这是我有效的解决方案:

我以我的形式使用:

@using (Html.BeginForm("RegisterOrder", "Account", FormMethod.Post, new { @class = "form", role = "form" }))
  {

   @Html.TextBoxFor(m => m.Email, new { @class = "form-control" })

   @Html.HiddenFor(m => m.quantity, new { id = "quantity", Value = 0 })

  }

在我的file.js文件中,我从GET请求中获取数量,并将变量如下传递给表单:

    $http({
        method: 'Get',
        url: "https://xxxxxxx.azurewebsites.net/api/quantity/" + usr
    })
        .success(function (data){

            setQuantity(data.number);

            function setQuantity(number) {
                $('#quantity').val(number);
            }

        });

答案 6 :(得分:0)

是的,你可以

Asp.net MVC 剃刀

我有 2 个输入

 <input id="TXTCount" type="number" readonly="readonly" class="form-control text-center text-bold" step="1" min="0" max="10000" value="1" inputmode="numeric" />

 <input id="TXTTOTal" type="number" readonly="readonly" class="form-control text-center text-bold" step="1" min="0" max="10000" value="1" inputmode="numeric" />

C# 视图

  @{string WatsMSG = "xxx";}

和 WhatsApp 链接

 <a class="btn btn-success" id="WatsSendApi" href="https://api.whatsapp.com/send?phone=0000&text=@WatsMSG">
    <b class="text-black" style="font-size:small"> whatsapp </b><i class="fa fa-whatsapp" style="color:white"></i> </a>

在 jQuery 中

 <script>
                                        $("#WatsSendApi").click(function () {
                                            var StringMSG;
                                            StringMSG=("Ineed : ");
                                            StringMSG += (" Item Name : ");
                                            StringMSG +='@item.ITName' ;
                                            StringMSG += (" Count: ");
                                            StringMSG += $('#TXTCount').val();
                                            StringMSG += (" Price: ");
                                            StringMSG += '@item.ITPrice';
                                            StringMSG += (" Total: ");
                                            StringMSG += $('#TXTTOTal').val();
                                            alert(StringMSG);
                                            this.href = this.href.replace("xxx", StringMSG);
                                        });
                                    </script>

我将脚本值和模型值传递给 C# 字符串

答案 7 :(得分:-1)

Razor View Server Side变量可以使用@读取到Client Side JavaScript 而 和JavaScript客户端变量可以使用@:

读取到Razor View