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

IT技术 javascript c# razor
2021-03-15 19:45:35

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

@{
    int a = 0;
}

<script>
    var b = ...
    @a = b;
</script>
6个回答

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

当服务器收到一个视图请求时,它只用 HTML、CSS 和 Javascript 代码创建视图。没有留下 C# 代码,它们都被“翻译”为客户端语言。

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

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

简而言之:

  1. 服务器收到请求。

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

  3. 服务器将视图的客户端版本作为对请求的响应返回给浏览器。(此时不再有 C#)

  4. 浏览器呈现页面并执行所有 Javascript

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

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

设置每个脚本的字段:

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

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

很简单,按如下方式使用它:@HtmlAction("ActionName", "myVar")在 HTLM 中,a@Html.Hidden等同于<input type="hidden" value=0 id="myVar"/>参见How to set and get ASP.net MVC Hidden Field values
2021-04-23 19:45:35
这不会改变模型值
2021-04-23 19:45:35
@TharushiGeethma 是的,你可以。只需将 JQuery 选择器与 .val() 一起使用,如下所示:$('#myVar').val();
2021-04-24 19:45:35
我们可以在剃刀视图中访问这个隐藏的字段值吗?如果是这样,如何?请解释
2021-04-25 19:45:35
那么你将如何检索隐藏字段中存储的值?例如,将其传递给 @HtmlAction("ActionName", HiddenFieldValue)
2021-05-02 19:45:35

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

我有一个List<QuestionType>我用它填充下拉列表。我想将该选择放入我在表单中创建QuestionTypeQuestion对象属性中。Knockout.js用于选择绑定。当用户选择一个对象时,这会将self.QuestionType敲除 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为对象-ed 版本。

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

Question对象中,我有一个名为的字段QuestionTypeJson,当用户选择问题类型时会填充该字段我使用这个字段来获取像这样QuestionTypeQuestion对象:

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,否则它将只使用支持字段中的内容。

我基本上已将 JavaScript 对象“传递”给我的模型,而无需使用RazorAjax调用。您可能可以在不使用的情况下执行与此类似的操作Knockout.js,但这就是我正在使用的...

我看到前段时间讨论过这个问题,但是如果有人再次遇到这个问题,这是我的解决方案:

在您的 *.cshtml 视图文件中:

<script>
var data = JsFunction("@Html.Raw(Model.Path)");
$(function () {
    $("#btn").click(function () {
        var model = { Id: '@Html.Raw(Model.Id)', Data: data }
        $.ajax({
            type: "POST",
            url: "/Controller/Action",
            data: model,
            datatype: "html",
            success: function() {
                console.log('Success');
            }
        });
    });
});
</script>

JavaScript 变量模型是我需要传递给 Razor ViewModel 的东西。它可以通过ajax请求来完成。你只需要在你的操作中有正确的参数/s,匹配在 JavaScript 中创建的 Json 对象。

希望它会帮助某人!

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

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

步骤:2 Javascript

 $('#stringName').replaceWith(localStorage.getItem("itemName"));
欢迎使用堆栈溢出!请随时浏览该网站,如果您需要有关该网站的其他帮助,请查看此内容哦,如果您遇到帮助页面未涵盖的问题,请随时在meta上提问
2021-04-22 19:45:35