如何在运行时将参数从ActionLink传递给控制器

时间:2016-03-23 09:54:24

标签: asp.net razor

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

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

控制器中的操作如下

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

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

4 个答案:

答案 0 :(得分:2)

如果您想使用超链接,可以执行以下操作

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

然后添加以下javascript。

 $(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更改为

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

答案 1 :(得分:1)

您可以对所需功能进行ajax调用。

可能的代码示例是

<Section onclick="MyFunction()">Edit Selected</section>

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

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

Ajax Call

答案 2 :(得分:0)

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

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

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

然后你需要在模型中使用类似的东西:

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

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

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

依旧......

在您的表单中,您需要:

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

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

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

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

答案 3 :(得分:0)

通过参考 Captain0 的回答和this post(也参考this post

来解决

在编辑器模板中,我在“复选框”的“数据”属性上添加了用户ID,如下所示

<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" data-userid=@Model.UserId value="true" />
    <input name="assignmentCheckBox" type="hidden" value="false" />
  </td>
  <td>
    @Html.DisplayFor(m => m.UserName)
  </td>

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

@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方法

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