#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. Спасибо, Ясен. Я внес изменения, и они отлично работают