Как передать массив из одного представления и действия в другое в ASP.NET MVC?

#c# #asp.net #asp.net-mvc #entity-framework

#c# #asp.net #asp.net-mvc #entity-framework

Вопрос:

Чего я хочу добиться: мне нужна функция, которая выбирает несколько записей со страницы индекса на моем asp.net веб-сайт mvc, которые перенаправляются на другую веб-страницу, где их можно массово редактировать.

Для этого я использую флажки, но я не знаю, как я могу получить доступ к содержимому этого массива из другого действия и представления.

На данный момент это код, который я сделал:

Представление индекса:

 @model IEnumerable<BulkDelete.Models.Employee>

@TempData["employeeIdsToDelete"];

    <div style="font-family:Arial">
        @using (Html.BeginForm("checking", "Home", FormMethod.Post))
        {
            <table class="table">
                <thead>
                    <tr>
                        <td>Checkbox<br /></td>

                        <th>Name</th>
                        <th>Gender</th>
                        <th>Email</th>
                    </tr>
                </thead>
                <tbody>

                    @foreach (var item in Model)
                    {
                        <tr>
                            <td><input type="checkbox" name="employeeIdsToDelete" id="employeeIdsToDelete" value="@item.ID" /></td>
                            <td>@item.Name</td>
                            <td>@item.Gender</td>
                            <td>@item.Email</td>
                        </tr>
                    }

                </tbody>
                <br />

            </table>
            <input type="submit" value="Delete selected employees" />


        }
    </div>
  

Действия контроллера:

   public class HomeController : Controller
    {
        SampleDBContext db = new SampleDBContext();
        public ActionResult Index()
        {
            return View(db.Employees.ToList()) ;
        }

      [HttpPost]
            public ActionResult UpdateMultipleRecords(IEnumerable<int> employeeIdsToUpdate)
        {
      
            return checking(employeeIdsToUpdate);
        }

  public ActionResult checking(IEnumerable<int>employeeIdsToUpdate)
        {

            foreach (var e in employeeIdsToUpdate)
            {
                Employee em = new Employee();
                em = db.Employees.Find(e);
                em.Name = ViewBag.Signature;

                db.Entry(em).State = EntityState.Modified;
                db.SaveChanges();

            }
            return View();
        }
  

Комментарии:

1. Другое действие = другой запрос. Существуют очевидные способы передачи данных между запросами: использовать контейнер сеанса на сервере, использовать строку запроса, использовать cookie. В вашем случае я бы выбрал первое.

Ответ №1:

Вместо публикации на индексной странице. разместите форму на другой странице.

 @using (Html.BeginForm("{actionNameOfAnotherPage}", "{anotherPageControllerName}", FormMethod.Post))
  

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

 @{ var index = 0;}
@foreach (var item in Model) 
{
    <tr>
        <td><input type="checkbox" name="[@index]employeeIdsToDelete" class="mycheckbox" id="employeeIdsToDelete" value="@item.ID" /></td>                                    
        <td>@item.Name</td>
        <td>@item.Gender</td>
        <td>@item.Email</td>
    </tr>
    @{ 
        index  ;
    }
}
  

Комментарии:

1. По какой-то причине при его передаче нет данных, как вы мне показали. Он продолжает указывать нулевую ссылку на объект

2. Ссылка на объект не установлена для экземпляра объекта. Описание: Необработанное исключение произошло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде. Сведения об исключении: System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта. Ошибка источника: строка 30: Строка 31: Строка 32: foreach (переменная в employeeIdsToUpdate) Строка 33: { Строка 34: Employee em = new Employee();

Ответ №2:

Вы также можете отправить их как Ajax вызов, и в этом сценарии вы также можете сделать это без формы.

 <div style="font-family:Arial">
            <table class="table">
                <thead>
                    <tr>
                        <td>Checkbox<br /></td>
                        <th>Name</th>
                        <th>Gender</th>
                        <th>Email</th>
                    </tr>
                </thead>
                <tbody>

                    @foreach (var item in Model)
                    {
                        <tr>
                            <td><input type="checkbox" name="employeeIdsToDelete" class="mycheckbox" id="employeeIdsToDelete" value="@item.ID" /></td>
                            <td>@item.Name</td>
                            <td>@item.Gender</td>
                            <td>@item.Email</td>
                        </tr>
                    }

                </tbody>
                <br />

            </table>
            <input type="button" onClick="deleteEmployees()" value="Delete selected employees" />
</div>
  

и ниже вашей html страницы

 <script>
function deleteEmployees() {
        var checkboxes = document.getElementsByClassName("mycheckbox");

        var checkedValues = [];

        for (var i = 0; i < checkboxes.length; i  ) {
            if (checkboxes[i].checked) {
                console.log(i);
                checkedValues.push(checkboxes[i].value)
            }
        }
        console.log(checkedValues);

        $.ajax({
            type: "POST",
            url: '@Url.Action("YourAction", "YourController")',
            data: { employeeIdsToUpdate: checkedValues },
            success: function (res) {
                if (res.ok) {
                    window.location = res.returnURL;
                }
            },
            error: function (req, status, error) {
                console.log(error);
            }
        });
    }
</script>
  

и в вашем POST ACTION вы можете принимать эти значения

 [POST]
public ActionResult UpdateEmployees(int[] employeeIdsToUpdate)
{

            foreach (int e in employeeIdsToUpdate)
            {
                Employee em = new Employee();
                em = db.Employees.Find(e);
                em.Name = ViewBag.Signature;

                db.Entry(em).State = EntityState.Modified;
                db.SaveChanges();

            }
                            return Json(new { ok = true, returnURL = Url.Action(nameof("YOUR VIEW IN HERE"))});

}
  

Ответ №3:

Вот несколько вариантов отправки массива из представления в какое-либо действие контроллера:

  1. Отправьте форму в действие вашего контроллера
  2. Отправьте ajax-вызов вашему действию контроллера
  3. Гиперссылка MVC, указывающая на действие вашего контроллера

Вот несколько вариантов отправки массива из действия контроллера в какое-либо другое действие контроллера:

  1. Сохранение данных в TempData (доступно для всех контроллеров)
  2. Сохранение данных в памяти браузера (временное хранилище)
  3. Сохранение данных в БД
  4. Сохранение данных в объекте сеанса
  5. Сохранение данных в объекте кэша

и, пожалуйста, не забудьте отметить это как ответ… Спасибо