перенаправление списка в представление после отправки формы пользователем

#asp.net-mvc-5

#asp.net-mvc-5

Вопрос:

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

                 @using (Html.BeginForm("Create","Coupons"))
            {
                <div class="row">
                    <div class="col-sm-8">
                        <div class="page-header">Generer Coupon</div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-sm-4">
                        @Html.AntiForgeryToken()
                        <div class="form-group">
                            @Html.LabelFor(m => m.Student)
                            @Html.DropDownListFor(m => m.Student, new SelectList(Model.Students, "Id", "Name"), "", new { @class = "form-control input-lg" })

                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-sm-4">
                        @Html.AntiForgeryToken()
                        <div class="form-group">
                            @Html.LabelFor(m => m.Price)
                            @Html.TextBoxFor(m => m.Price, new { @class = "form-control input-lg" })
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-sm-4">
                        @Html.AntiForgeryToken()
                        <div class="form-group">
                            @Html.LabelFor(m => m.NumberOfCoupons)
                            @Html.TextBoxFor(m => m.NumberOfCoupons, new {@class = "form-control input-lg"})
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-sm-4">
                        <button class="btn btn-success btn-lg">Generer</button>
                    </div>
                </div>
            }
  

Я перенаправляю представление в метод Create на CouponsController

         [HttpPost]
    public ActionResult Create(CouponViewModel viewModel)
    {
        if (!ModelState.IsValid)
        {
            var model = new CouponViewModel
            {
                Students = _context.Students.ToList()
            };
            return View("Index", model);
        }

        for (int i = 1; i <= viewModel.NumberOfCoupons; i  )
        {
            var coupon = new Coupon
            {
                CouponNumber = viewModel.CouponNumber,
                ValidationCode = viewModel.ValidationCode(6),
                Price = viewModel.Price,
                StudentId = viewModel.Student,
                DateTime = Convert.ToDateTime(DateTime.Now.ToString("yy-MMM-dd ddd"))
            };

            _context.Coupons.Add(coupon);

            _context.SaveChanges();

        }

        var coupons = _context.Coupons
           .Where(c => c.StudentId == viewModel.Student)
           .Include(s => s.Student)
           .ToList();

        TempData["viewModel"] = coupons;
        return RedirectToAction("GetCoupons");
    }
  

вот представление, в котором я получаю временные данные для отображения в представлении

         [HttpPost]
    public ActionResult GetCoupons()
    {
        Coupon coupon = TempData["viewModel"] as Coupon;

        return View("Print", (IEnumerable<Coupon>)coupon);
    }
  

Я застрял примерно на 3 дня. Я не знаю, где я ошибаюсь

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

1. На чем именно вы застряли? GetCoupons() должно быть [HttpGet] , и вы можете рассмотреть возможность передачи только идентификатора и выполнения поиска в перенаправленном действии. Вы могли бы избежать TempData этого. Вы также приводите коллекцию к единице Coupon .

2. «Вы также создаете коллекцию для одного купона»… Я пытался не приводить, но я не знаю, как это сделать. Как передать идентификатор.?

3. Когда я запускаю проект, он говорит: «Ресурс / купоны / Getcoupons не могут быть найдены»

Ответ №1:

В вашем примере есть несколько проблем. Но вы можете устранить их, если сделаете что-то по-другому.

 [HttpPost]
public ActionResult Create(CouponViewModel viewModel)
{
    return RedirectToAction("GetCoupons", new { studentId = viewModel.Student });
}
  

Во-первых, ваше перенаправленное действие должно быть отмечено [HttpGet] . Вы также можете избежать TempData , если передадите идентификатор в строке запроса, а затем выполните поиск в перенаправленном действии.

 [HttpGet]
public ActionResult GetCoupons(int studentId)
{
    var coupons = _context.Coupons
       .Where(c => c.StudentId == studentId)
       .Include(s => s.Student)
       .ToList();

    return View("Print", coupons);
}
  

TempData это не так, но оно не будет сохраняться при обновлении. Иногда вы передаете конфиденциальные данные, что делает их полезными. Ваше приведение к одному Coupon не совсем то, что вы хотите — вместо этого приведите к коллекции.

 [HttpGet]
public ActionResult GetCoupons()
{
    var coupons = TempData["viewModel"] as IEnumerable<Coupon>;
    return View("Print", coupons);
}
  

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

1. Спасибо, Ясен. Я внес изменения, и они отлично работают