Передайте несколько полей данных с DropDownList при изменении - PullRequest
1 голос
/ 25 апреля 2019

В настоящее время я пытаюсь создать страницу изменения роли пользователя. Ниже приведено то, чего я достиг ...

Example

(поле имени пользователя ЗАПОЛНЯЕТСЯ, я только что его отключил.)

Ниже мой взгляд выпадающий ...

@Html.DropDownList("Roles", new SelectList(ViewBag.RoleList), "Modify Role", new { @class = "form-control" })

а вот действие контроллера, которое мне нужно для вызова

    [AuthLog(Roles = "Super Admin")]
    [HttpPost]
    public ActionResult ModifyUser(string id)
    {
        string newRole = Request.Form["Roles"];
        if (id != null && newRole != null)
        { 
            ApplicationDbContext context = new ApplicationDbContext();
            var newRoleName = context.Roles.FirstOrDefault(u => u.Name == newRole);
            var newid = newRoleName.Id;
            context.UpdateRole(id, newid);
        }
        return RedirectToAction("Index", "UserControl");
    }

Ниже приведены данные, которые я отправляю своему методу, и способ создания раскрывающегося списка.

    {
        [AuthLog(Roles = "Super Admin")]
        public ActionResult Index()
        {
            ApplicationDbContext context = new ApplicationDbContext();
            var usersWithRoles = (from user in context.Users
                                  select new
                                  {
                                      UserId = user.Id,
                                      Username = user.UserName,
                                      user.Email,
                                      RoleNames = (from userRole in user.Roles
                                                   join role in context.Roles on userRole.RoleId
                                                       equals role.Id
                                                   select role.Name).ToList()
                                  }).ToList().Select(p => new UserControlModel()

                                  {
                                      UserId = p.UserId,
                                      Username = p.Username,
                                      Email = p.Email,
                                      Role = string.Join(",", p.RoleNames)
                                  });
            var roleList = context.Roles
                .OrderByDescending(x => x.Id)
                .Select(x => x.Name).ToList();
            ViewBag.RoleList = roleList;
            return View(usersWithRoles);
        }

Вид:

@using (Html.BeginForm("ModifyUser", "UserControl", FormMethod.Post, new { id = "ManageUser" }))
{

    <div class="panel panel-primary">
        <div class="panel-heading">
            <h3 class="box-title">
                <b>Users with Roles</b>
            </h3>
        </div>
        <div class="panel-body">
            <table class="table table-hover table-bordered table-condensed" id="UsersWithRoles">
                <thead>
                <tr>
                    <td><b>Username</b></td>
                    <td><b>Roles</b></td>
                </tr>
                </thead>
                @foreach (var user in Model)
                {
                    <tr>
                        <td>@user.Username</td>
                        <td>@user.Role</td>
                        <td>@Html.DropDownList("Roles", new SelectList(ViewBag.RoleList), "Modify Role", new { @class = "form-control" })</td>
                    </tr>
                }
            </table>
        </div>
    </div>
}

Проблема в том, что мне нужен способ не только отправить данные, которые выбраны в моем раскрывающемся списке, но также и идентификатор пользователя. UserId указан в моем методе и введен в цикл таблицы через user.UserId public string UserId { get; set; }

В идеале это должно быть сделано при простом изменении выбора роли в раскрывающемся списке.

Вкратце - мне нужен способ, чтобы мой раскрывающийся список отправлял идентификатор пользователя и выбранную роль в действие / метод моего контроллера всякий раз, когда в раскрывающемся списке выбирается роль.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Вот еще один вариант, который вы можете использовать для настройки формы для каждой строки.

С вашей точки зрения, замените существующую форму на форму в каждой строке, чтобы вы также могли передать свой идентификатор пользователя в пределахФорма подачи.Кроме того, в раскрывающемся списке добавлено «onchange», поэтому отдельная родительская форма автоматически отправляется при изменении.

<div class="panel panel-primary">
    <div class="panel-heading">
        <h3 class="box-title">
            <b>Users with Roles</b>
        </h3>
    </div>
    <div class="panel-body">
        <table class="table table-hover table-bordered table-condensed" id="UsersWithRoles">
            <thead>
                <tr>
                    <td><b>Username</b></td>
                    <td><b>Roles</b></td>
                </tr>
            </thead>
            @foreach (var user in Model)
            {
                <tr>
                    <td>@user.Username</td>
                    <td>@user.Role</td>
                    <td>
                        @using (Html.BeginForm("ModifyUser", "UserControl", FormMethod.Post, new { id = "ManageUser" }))
                        {
                            @Html.HiddenFor(modelItem => user.UserId)
                            @Html.DropDownList("Roles", new SelectList(ViewBag.RoleList), "Modify Role",
                                new { @class = "form-control", onchange = "this.parentElement.submit()" })
                        }
                    </td>
                </tr>
            }
        </table>
    </div>
</div>

Теперь вы можете получить как роль, так и идентификатор пользователя из полученного действия:

[AuthLog(Roles = "Super Admin")]
[HttpPost]
public ActionResult ModifyUser(string id)
{
    string newRole = Request.Form["Roles"];
    string userId = Request.Form["user.UserId"];
    // ...
}
1 голос
/ 30 апреля 2019

Вот как бы я это сделал.

  1. Оберните выпадающий список (и другие поля) в html-форму и присвойте ему идентификатор
  2. Добавить скрытый ввод со значением идентификатора пользователя, который вы хотите передать на сервер
  3. В выпадающем списке добавьте событие onchange, которое вызывает метод javascript OnChangeFunc

@Html.DropDownList("Roles", new SelectList(ViewBag.RoleList), "Modify Role", new { @class = "form-control", @onchange="OnChangeFunc()" })

  1. Часть Javascript

    <script> function OnChangeFunc(){ //Get form by ID and submit it } </script>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...