Java 脚本 MVC 中的动态控制器方法名称

本文关键字:控制器 方法 动态控制 动态 脚本 MVC Java | 更新日期: 2023-09-27 18:32:18

我有一个视图,其中包含允许管理员删除用户下载给定文件的能力的复选框。我想在管理员更改复选框时更改基础用户属性CanDownloadA/CanDownloadB。我的观点是

<table class="table">
    <tr>
        <th>Username</th>
        <th>Email Addres</th>
        <th>UserCost Access</th>
        <th>DrGroup Access</th>
        <th>Last Login</th>
    </tr>
    @{
        if (Model != null)
        {
            foreach (var item in Model.UserList)
            {
                <tr>
                    <td>@Html.DisplayFor(modelItem => item.UserName)</td>
                    <td>@Html.DisplayFor(modelItem => item.EmailAddress)</td>
                    <td>@Html.CheckBoxFor(modelItem => item.CanDownloadA.Value, 
                         new { data_item = item.UserName, action = "EditAAccess"})</td>
                    <td>@Html.CheckBoxFor(modelItem => item.CanDownloadB.Value,
                         new { data_item = item.UserName, action = "EditBAccess" })</td>
                    <td>@Html.DisplayFor(modelItem => item.LastLoginDateTime)</td>
                    <td>
                        @Ajax.ActionLink(
                            "Remove",
                            "UpdateUserInfo",
                            "Tools",
                            new
                            {
                                userName = item.UserName
                            },
                            new AjaxOptions
                            {
                                HttpMethod = "GET"
                            },
                            new { onclick = "return confirm('Are you sure you wish to delete user?');" })
                    </td>
                </tr>
            }
        }
    }
</table>
...
 <script>
    $(function () {
        $("input[type=checkbox]").click(function () {
            var data_item = $(this).data("userName");
            $.ajax({
                url: 'Tools/' + $(this).data("action"),
                type: 'POST',
                data: { userName: data_item, isChecked: $(this).is(':checked') },
                success: function (result) {
                }
            });
        });
    });
</script>

如果脚本正在调用相应的控制器方法,则

[HttpPost]
[AllowAnonymous]
public async Task<ActionResult> EditUserCostAccess(
    string userName, bool isChecked)
{
    return await EditAccess(userName, isChecked, DownloadType.UserCost);
}

[HttpPost]
[AllowAnonymous]
public async Task<ActionResult> EditDrGrouptAccess(
    string userName, bool isChecked)
{
    return await EditAccess(userName, isChecked, DownloadType.DrGroup);
}

如果我从复选框中删除action = "EditBAccess" HtmlParameters并写入

url: 'Tools/EditDrGrouptAccess',

在 JQuery 脚本中,将触发相应的方法。但是,我不想有两个脚本来触发每个方法,所以我编写了不起作用url: 'Tools/' + $(this).data("action"),

  1. 为什么我的JavaScript函数(特定url: 'Tools/' + $(this).data("action"),)不起作用?
  2. 用户名在传递给控制器时为空,为什么?

谢谢你的时间。


问题 2 已由下面的 @Samuel Caillerie 解决。但是 1.莫。我已将脚本更改为

<script>
    $(function () {
        $("input[type=checkbox]").click(function () {
            var data_item = $(this).data("item");
            var data_action = $(this).data("action");
            $.ajax({
                url: 'Tools/' + data_action,
                type: 'POST',
                data: { userName: data_item, isChecked: $(this).is(':checked') },
                success: function (result) {
                }
            });
        });
    });
</script>

和复选框代码:

<td>@Html.CheckBoxFor(modelItem => item.CanDownloadUserCost.Value, 
    new { data_item = item.UserName, data_action = "EditUserCostAccess"})</td>

但这行不通。

Java 脚本 MVC 中的动态控制器方法名称

对于你的第一点,我认为这只是你的代码中的一个错误:

<td>@Html.CheckBoxFor(modelItem => item.CanDownloadA.Value, 
       new { data_item = item.UserName, data_action = "EditAAccess"})</td>
<td>@Html.CheckBoxFor(modelItem => item.CanDownloadB.Value,
       new { data_item = item.UserName, data_action = "EditBAccess" })</td>

(你必须放data_action而不是action)。

对于第二点,在 js 中将userName更改为 item

var data_item = $(this).data("item");

或者将传递给复选框的属性的名称更改为 data_userName ...