将 Javascript 数组发送到控制器并在另一个 URL 中呈现视图结果

Send a Javascript Array to a Controller And Render View Result in Another URL

我已经尝试了 4 天但没有成功,我是初级开发人员,所以这就是原因。

上下文:

我有一个 flexigrid 显示从数据库收集的数据,在一个非常特殊的列中,有一个复选框,我创建了一个 javascript 函数来获取实体 Id 当您单击复选框并将其存储在 javascript array 上时,我想将其发送到ActionResult

问题:

我可以使用 Ajax,但我无法呈现 ActionResult 视图,我得到 404。尝试使用 @Html.ActionLink 但没有重新调整 javascript 数组. 那么我如何将 post 数组 javascript 传递给控制器​​并遵循该控制器流程,比如用另一个 URL 渲染另一个视图?

Javascript数组:

var arrayId = new Array();

查看:

<a href="@Url.Action("SomeAction", "SomeController", new { area = "SomeArea", arrayId = arrayId })">

控制器:

public ActionResult SomeAction(object[] arrayId)
{
  //some code

  return View("AnotherView");
}

解决方法:

通过ajax向服务器发送数据是个好主意,但问题是如何响应用户。一种解决方案是将用户重定向到另一个页面或使用适当的更改刷新当前页面。这样就可以使用JavascriptResult了。

return JavaScript("window.location = 'http://www.domain.com/...'");

return JavaScript("location.reload(true)");

...that I want to send to a ActionResult.

我相信你在这里可能有点困惑。在 ASP.NET MVC 中,任何 从 AJAX 或完整请求收到请求 的任何东西都是 动作 。该操作的结果,如 JSON 响应或整页结果,是一个 ActionResult。

始终将其视为 请求> 响应。请求由您的操作处理,响应是操作输出的内容。

现在,回答你的问题。将此页面视为第一个页面,它从数据库输出 ID:

<form method="post" action="/home/someaction">
    <ul>
        <li><label><input type="checkbox" name="arrayId" value="1" />1</label></li>
        <li><label><input type="checkbox" name="arrayId" value="2" />2</label></li>
        <li><label><input type="checkbox" name="arrayId" value="3" />3</label></li>
        <li><label><input type="checkbox" name="arrayId" value="4" />4</label></li>
    </ul>
    <button>Post array to action SomeAction</button>
</form>
<script type="text/javascript">
        $(function(){
            $('form').on('submit', function () {
                $('checkbox:checked').each(function (ix, el) {
                    $(el).attr('name', 'arrayId[' + ix + ']');
                });
            });
        });
</script>

让我们看看这里发生了什么:

  • 对于从数据库返回的每一项,我们都有一个复选框。注意 name 属性,这很重要
  • 所有内容都在指向我们第二个操作的表单中。这是将接收数组的那个
  • 提交表单后,我们遍历每个选中的复选框,将名称更改为类似 arrayId[0] 的名称。这是必需的。 ASP.NET 使用名称 attr 将接收到的数据绑定到操作期望的内容。如果它是一个集合(如列表或数组),名称还必须包含一个基于 0 的索引器。这就是我们在 post 填写表格之前所做的事情。

将接收此 post 的操作如下所示:

[HttpPost]
public ActionResult SomeAction(string[] arrayId)
{
    return View(arrayId);
}