将Javascript数组发送到控制器ASP.NET MVC

Sending a Javascript array to controller ASP.NET MVC

本文关键字:控制器 ASP NET MVC Javascript 数组      更新时间:2023-09-26
  1. 我试图将用户输入存储在javascript数组中,并通过ajax调用将其发送到控制器。但我在控制器的参数中得到的都是空的。这是代码:

    <table class="table-condensed table-bordered table-striped table-responsive">
        @foreach (var project in projects)
        {
            <tr>     
                @foreach (var parameter in parameters)
                {
                    <td>
                        <input type="text" class="form-control remar" id=@i />
                    </td>
                    i++;
                }
            </tr>
        }
        <tr>
            <td colspan=@(parameters.Count() + 1)>
                <button class="btn btn-primary pull-right" onclick="insert()">Submit Remarks</button>
            </td>
        </tr>
    </table>   
    <script>
    function insert() {
    var remarks = [];
    jQuery(".remark").each(function () {
        remarks.push(jQuery(this).val());
    });
    $.ajax({
        type: "POST",
        url: "@Url.Action("AddRemarksToEvaluationSheet", "Teacher")",
        data: JSON.stringify({ function_param: remarks }),
        contentType: "application/json; charset=utf-8;"
    });
    }
    </script>
    

控制器:

public ActionResult AddRemarksToEvaluationSheet(string[] function_param)
    {
        return View();
    }

有什么帮助吗?附言:以上代码已编辑。成功了!

这里有很多事情要做。。。

首先,不要给你的输入框提供数字的id——在这种情况下,看起来你甚至没有使用这个值。。。但如果你需要它,把值放入一个数据元素:

<input type="text" class="form-control remark" data-remark-id="@i" />

检索值时,需要获取值,而不是文本框本身:

var remarks = [];
jQuery(".remark").each(function() {
    remarks.push(jQuery(this).val());
});

当对参数(如数组或复杂对象)进行任何奇怪的操作时,如果使用JSON而不是默认的URL编码,会让事情变得更好。

您还应该避免使用绝对路径,而是使用Url.Action,这样无论您的应用程序相对于域位于何处,它都可以工作。

$.ajax({
    type: "POST",
    url: "@Url.Action("AddRemarksToEvaluationSheet", "Teacher")",
    data: JSON.stringify({ function_param: remarks }),
    contentType: "application/json; charset=utf-8;"
});

您可以接受字符串数组,而不是对象数组:

[HttpPost]
public ActionResult AddRemarksToEvaluationSheet(string[] function_param)
{
}

我有一种感觉,您一开始就没有得到数组中的注释。

如果您还没有,请使用允许您调试js的浏览器。如果使用Chrome,请右键单击->insect元素(或F12)。转到"Sources"选项卡,转到您的js文件并放置一个断点来查看comments数组的样子。

关于代码:

您似乎不需要输入上的id属性。更不用说数字id了。

要填充comments数组,请获取所有dom元素,这些元素具有您放置在所有输入上的类。对于每一个,推送数组中的值。

var remarks = [];
$(".form-control").each(function() {
    remarks.push($(this).val());
});

您可以添加额外的代码来只添加有值的代码。

var remarks = [];
    $(".form-control").each(function() {
        if($(this).val().length){
           remarks.push($(this).val());
        }
    });

ajax调用:

$.ajax({
    type: "POST",
    url: addRemarksUrl,
    data: JSON.stringify({ function_param: remarks }),
    contentType: "application/json; charset=utf-8;"
});

其中addRemarksUrl可以是在html中声明的全局变量。

还有其他获取网址的方法。看看这里:

如何将剃刀创建的Url发送到js文件

该用户提供了3种可能的解决方案:

  1. 全局js变量
  2. 自定义"数据-"属性
  3. 隐藏输入