Передача массива идентификаторов со страниц просмотра в контроллер - PullRequest
0 голосов
/ 12 марта 2019

Я обнаружил, что идентификаторы не передаются со страницы бритвы на контроллер. Так что мой int[] userIds пуст, но я не знаю, почему или как это исправить. Пожалуйста помоги.

Ниже мой код.

Контроллер аккаунта:

public class AccountController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;

    private readonly SignInManager<ApplicationUser> _signInManager;

    private readonly RoleManager<Role> _roleManager;

    public AccountController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager, RoleManager<Role> roleManager)
    {
        _userManager = userManager;
        _signInManager = signInManager;
        _roleManager = roleManager;
    }

    public IActionResult Remove()
    {
        var users = _userManager.Users.OrderBy(o=> o.LastName).ToList();
        RemoveViewModel removeViewModel = new RemoveViewModel(users);
        return View(removeViewModel);
    }

    [HttpPost]
    public IActionResult Remove(int[] userIds)
    {

        if (userIds == null || userIds.Length==0)
        { 
            throw new System.ArgumentException("Array is empty", "original");
        }

        return Redirect("/Home/Index");
    }

вид:

    @model WebApplication1.ViewModels.RemoveViewModel
<html>
<body>
    <form asp-controller="Account" asp-action="Remove" method="post">

            @foreach (var item in Model.Users)
            {
            <div>
                <label> @item.FirstName @item.LastName</label>
                <input type="checkbox" id="@item.Id" value="@item.Id" />
            </div>
            }


        <input type="submit" value=" Remove User" /><br>

    </form>

    </body>
</html>

ViewModel:

    namespace WebApplication1.ViewModels
{
    public class RemoveViewModel
    {
        public List<ApplicationUser> Users { get; set; }

        public RemoveViewModel(List<ApplicationUser> users)
        {
            Users = users; 
        }
    }
}

Ответы [ 4 ]

1 голос
/ 13 марта 2019

Вам необходимо использовать свойство name для передачи выбранных идентификаторов в действие с соответствующим именем параметра.

Просмотр:

@foreach (var item in Model.Users)
{
    <div>
        <label>@item.FirstName @item.LastName</label>
        <input type="checkbox" name="userIds" id="@item.Id" value="@item.Id" />
    </div>
}

Действие:

[HttpPost]
public IActionResult Remove(int[] userIds)
1 голос
/ 12 марта 2019

Вы должны указать в своем Html, что элементы принадлежат списку, указав им index, и, сделав это, model binding сможет распознать, что вы создаете список и используетепомощники по тегам ядра ядра asp, он должен сгенерировать именно тот HTML, который необходим для привязки:

<form asp-controller="Account" asp-action="Remove" method="post">

            @for (int i = 0; i < Model.Users.Count; i++)
            {
            <div>
                <label> @Model.Users[i].FirstName @Model.Users[i].LastName</label>
                <input type="checkbox" asp-for="@Model.Users[i].Id" />
            </div>
            }


        <input type="submit" value=" Remove User" /><br>

    </form>

Я бы порекомендовал обратиться к помощникам по тегам, поскольку они могут сделать вашу разметку намного более читабельной и с меньшим количеством ошибок.Склонны к тому, что они много для вас генерируют.

Вы также можете написать свои собственные, которые могут сделать жизнь по-настоящему легкой!

После того, как вы попробуете выше, я рекомендуюВы проверяете сгенерированный html в отладчике браузера, чтобы увидеть html, который он создает, и понимаете, как работает привязка.

1 голос
/ 12 марта 2019

Привязка модели в Asp.Net MVC выполняется атрибутом name элементов html.Итак, добавьте атрибут name к input со значением userIds.Следовательно, несколько элементов с одним именем будут привязаны к одному параметру с тем же именем, что приведет к созданию списка:

<input name="userIds" type="checkbox" id="@item.Id" value="@item.Id" />
0 голосов
/ 12 марта 2019

спасибо, ребята, это было так же просто, как добавить атрибут name или asp-for к моему входному тегу для обеспечения привязки данных.

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