【问题标题】:Can't obtain values from controls through javascript in razor page无法通过剃刀页面中的javascript从控件中获取值
【发布时间】:2021-12-14 12:26:18
【问题描述】:

我有一个 razor 页面,其中 evrything 显示正常,但我需要能够读取几个控制器中的值,以便在调用中将它们作为参数传递以预过滤某些数据:

@page
@addTagHelper*, Microsoft.AspNetCore.Mvc.TagHelpers
@model MyApp.Pages.IndexModel
@{
    ViewData["Title"] = "MyApp";
}

<div class="col-12 border p-3 mt-3">
    <h3>Filters</h3>
    <div class="col-12">
        <select id="portMultiselect" name="lsPorts" asp-items="@Model.Ports" multiple></select>
        <input id="searchString" type="text" name="searchString">
    </div>
</div>
    @* A "REFRESHABLE" TABLE GOES HERE...*@

@section scripts{

    @* REFRESH SCRIPT *@
    <script type="text/javascript">
            $(function () {
                setInterval(loadTable, 60000);
                loadTable();
            });

        function loadTable() {
            var select1 = document.getElementById("portMultiselect");
            var selectedPorts = [];
            for (var i = 0; i < select1.options.length; i++) {
                if (select1.options[i].selected) selectedPorts.push(select1.options[i].value);
            }
            var searchString = document.getElementById('searchString').value;
            if (searchString != "" || selectedPorts.length != 0) {
                debugger;
            }
                fetch('/Index?handler=IndexPartial', {
                    data: {
                        searchString: searchString,
                        selectedPorts: selectedPorts
                    }
                })
                    .then((response) => {
                        return response.text();
                    })
                    .then((result) => {
                        document.getElementById('refreshable').innerHTML = result;
                    });
            }
        </script>
}

如您所见,我试图在我的多选和文本输入中捕获选定的值,以作为刷新脚本中的参数传递。

我正确地到达了预期的端点,但我从来没有得到任何值(它总是空的和零)我什至在 Javascript 代码中添加了一个调试器,我从来没有遇到过。

为什么我无法读取这些值?

编辑: 我见过其他处理这些问题的方法,例如数据绑定,但正如 here 所提到的,避免页面重新加载的唯一方法是 javascript 和 AJAX,所以我仍然需要从 javascript 中获取这些值。

【问题讨论】:

  • 您不能使用数据绑定来更轻松地获取这些值吗?
  • @T.Trassoudaine 如果我添加带有帖子的数据绑定,则整个页面都会刷新,这不是我想要的,我只想刷新部分视图,使用这些控件的值过滤数据有
  • 你应该使用select1.options.length,而不是select1.length

标签: javascript razor-pages


【解决方案1】:

最后,我找到了解决我的困境的方法如下:

按照in this page 显示的示例,我更改了呈现 selectPicker 的方式:

@page
@addTagHelper*, Microsoft.AspNetCore.Mvc.TagHelpers
@model MyApp.Pages.IndexModel
@{
    ViewData["Title"] = "MyApp";
}

<div class="col-12 border p-3 mt-3">
    <h3>Filtros</h3>
    <div class="row">
        <div class="col-6">
            <p>Puertos</p>
            @Html.DropDownListFor(x =>
                x.selectPort,
                (IEnumerable<SelectListItem>)ViewData["MyPorts"],
                new
                {
                    @id = "portMultiselect",
                    @class = "form-control selectpicker",
                    @Value = @Model.Ports,
                    data_live_search = "true",
                    multiple = "multiple"
                })
        </div>
        <div class="col-6">
            <p>Nombre de variable</p>
            <input id="searchString" type="text" name="searchString">
        </div>
    </div>
</div>

这对您正在使用的模型进行了某些更改,您可以按照 T.Trassoudaine 评论的说明绑定数据,here

为此,您需要在 _Layout 中添加指定的引用(用于引导选择),您可以检查所有需要添加的内容 here

最后,您需要在 javascript 中使用 AJAX 来传回参数:

<script type="text/javascript">
    $(function () {
        setInterval(loadTable, 1000);
        loadTable();
    });

    function loadTable() {
        var select1 = document.getElementById("portMultiselect");
        var selectedPorts = [];
        for (var i = 0; i < select1.options.length; i++) {
            if (select1.options[i].selected) selectedPorts.push(select1.options[i].value);
        }
        var searchString = document.getElementById('searchString').value.toUpperCase();
        var searchPorts = "";
        if (selectedPorts.length != 0) {
            searchPorts = selectedPorts.join(",");
        }
        $.ajax({
            url: '/?handler=IndexPartial',
            data: {
                searchString: searchString,
                searchPorts: searchPorts
            },
            success: function (data) {
                document.getElementById('refreshable').innerHTML = data;
            }
        })
    }
</script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2022-01-16
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 2021-11-28
    相关资源
    最近更新 更多