关于asp.net:如何在运行时将参数从ActionLink传递给控制器

How to pass parameter from ActionLink to controller at runtime

我是Asp.net的新手,目前我想在用户点击动作链接按钮时将一些参数(选择的用户ID列表)传递给控制器,下面是动作链接代码,

1
@Html.ActionLink("Edit Selected","EditSelected", new { selectedUserIds = @Model.GetSelectedUserIds() })

控制器中的动作如下

1
2
3
// GET:
    public async Task<ActionResult> EditSelected(List<string> selectedUserIds)
    {

但是我发现ActionLink只是在加载页面时编译而且当我点击这个链接按钮时不会更新selectedUserIds参数,那么我该如何处理呢?


如果要为此使用超链接,可以执行以下操作

1
2
3
4
5
public async Task<ActionResult> EditSelected(string selectedUserIds)
{
  var values = selectedUserIds.Split(',');
  //the rest of your code
}

然后添加以下javascript。

1
2
3
4
5
6
7
8
 $(document).on('click', '.myLink', function(e) {
            e.preventDefault();

            //code to get all the selected values...
            var selectedUserIds = ['value1','value2'];

            window.location = $(this).attr('href') + '?selectedUserIds=' + selectedUserIds;
        });

并将Html.ActionLink更改为

1
@Html.ActionLink("ClickMe","EditSelected",null,new {@class="myLink"})

您可以对所需的函数进行ajax调用。

可能的代码示例是

1
2
3
4
5
6
7
8
9
10
11
12
<Section onclick="MyFunction()">Edit Selected</section>


function MyFunction(){
    $.Ajax({
             url:'http://localhost/controller/EditSelected',
             data: {
                   SelectedUserIds: @Model.GetSelectedUserIds();
                   },
             success:'http://....'
          })
}

有关详细信息,请参阅此帖子

Ajax Call


通过参考Captain0的回答和这篇文章解决(也参考这篇文章)

在编辑器模板中,我在复选框的'data'属性上附加了用户ID,如下所示

1
2
3
4
5
6
7
8
9
10
11
<tr>
  <td style="text-align: center">
    @* Use below way instead of Html.CheckBox to attach the user Id to the data property
    and this will be parsed in the javascript to collect the selected user Id which will then be treat as parameter of action
    *@
    <input id="assignmentCheckBox" name="assignmentCheckBox" type="checkbox" [email protected] value="true" />
    <input name="assignmentCheckBox" type="hidden" value="false" />
  </td>
  <td>
    @Html.DisplayFor(m => m.UserName)
  </td>

然后在javascript中我循环复选框,其id为'assignmentCheckBox'并被选中,然后获取用户Id数据并将其放入数组,最后通过使用收集的数据作为参数跳转到指定位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Html.ActionLink("Edit Selected","GroupEdit", null, new { @class ="editSelectedLink" })

$(document).on('click', '.editSelectedLink', function(e) {
      //Cancel original submission
      e.preventDefault();

      //Build a collection of your objects
      var selectedUserIds = new Array();

      //Populate each of your checked values into the collection
      $('[id="assignmentCheckBox"]:checked').each(function() {
        selectedUserIds.push($(this).data('userid').toString());
      });

      window.location = $(this).attr('href') + '?selectedUserIds=' + selectedUserIds;
    });

这是相应的Action方法

1
2
3
4
5
public async Task<ActionResult> GroupEdit(string selectedUserIds)
{
      var userIds = selectedUserIds.Split(',');
      foreach (var userId in userIds)
      { . . .

你需要做一些事情才能让它发挥作用!

我建议您使用表单助手并将表单发布到您的操作中!

1
2
@using (Html.BeginForm("YourAction","Yourcontroller", FormMethod.Post, new {your html attributes}))
    {...}

那么你需要在模型中使用类似的东西:

1
2
public List<SelectListItem> IdList{ get; set; } // For your select list
public list<string> SelectedItems{get;set;} // Your selected Ids

在您的控制器中,您初始化并填充列表:

1
2
model.IdList = new List<SelectListItem>();
model.IdList.Add(new SelectListItem() { Text ="YourText", Value ="YourId" });

等等...

在您的表单中,您需要:

1
@Html.ListBoxFor(m => m.SelectedItems, Model.IdList , new {@class ="form-control", id ="idList"})

使用输入类型提交您将表单发布到您的操作。

该操作需要[HttpPost]属性并将您的模型作为参数。

使用Model作为参数,您可以使用所选ID列表!