#c# #asp.net-mvc
#c# #asp.net-mvc
Вопрос:
Я сталкиваюсь с проблемой, когда, если пользователь выбирает любую другую строку, кроме 1-й строки, сообщение с данными возвращается пустым. Данные отображаются в сообщении только в том случае, если пользователь выбирает 1-ю строку.
Это работает, только если я использую FormCollection для возврата данных.
Что я делаю не так?
История заказов.CSHTML
@model DiningOrder.Models.JSON.OrderHistory
@for (int i = 0; i < Model.orders.Count(); i )
{
@using (Html.BeginForm("Reorder", "OrderHistory", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(x => Model.orders[i].id)
<input type="submit" value="REORDER" class="btn btn-dark btn-lg btn-block" />
}
}
Контроллер истории заказов
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Reorder(OrderHistory model)
{
return View();
}
Комментарии:
1. Я не вижу никаких данных, кроме скрытых файлов. Где строки? какие данные вы отправляете?
2. И, пожалуйста, отправьте свой контроллер. Вы уверены, что ваша Model.orders. Count()> 1
3. Данные являются скрытым полем.
4. Извините, я имел в виду действие, которое создает это представление
Ответ №1:
Из опубликованного вами представления у вас есть форма для каждой строки! Следовательно, всякий раз, когда вы отправляете сообщение обратно на сервер, вы отправляете только один идентификатор заказа.
Если вам нужен только идентификатор заказа для повторного заказа, вы должны создать свой Reorder
метод, чтобы принимать только идентификатор заказа:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Reorder(int orderId)
{
return View();
}
Если вы хотите, чтобы пользователь мог выбирать несколько заказов и переупорядочивать их, тогда вы, вероятно, немного измените модель представления:
// I am totally guessing
public class OrderHistoryViewModel
{
public IEnumerable<OrderViewModel> Orders { get; set; }
}
public class OrderViewModel
{
public int OrderId { get; set; }
public bool SelectedToReorder { get; set; }
}
Затем вы инициализируете список заказов в своем [HttpGet]
методе:
public class OrderHistoryController : Controller
{
public ActionResult Index()
{
var vm = new OrderHistoryViewModel
{
Orders = // Get the orders from your persistence layer
};
return View(vm);
}
}
Тогда в index.cshtml
представлении вместо размещения нескольких форм вам понадобится только одна:
@model OrderHistoryViewModel
<h3>Order History</h3>
@using (Html.BeginForm("reorder", "orderhistory", new { area = "" }, FormMethod.Post, null)
{
@Html.AntiForgeryToken()
for (int i = 0; i < Model.Orders.Count(); i )
{
@Html.HiddenFor(x => x.Orders[i].Id)
@Html.CheckboxFor(x => x.Orders[i].SelectedToReorder)
}
<button type="submit">Re-order</button>
}
Наконец, в вашем [HttpPost]
методе вы можете фильтровать те заказы, которые выбирает пользователь, и обрабатывать вашу логику:
public class OrderHistoryController : Controller
{
public ActionResult Index()
{
var vm = new OrderHistoryViewModel
{
Orders = // Get the orders from your persistence layer
};
return View(vm);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Reorder(OrderHistoryViewModel model)
{
if (ModelState.IsValid)
{
var selectedOrderIds = model.Orders
.Where(x => x.SelectedToReorder == true)
.ToArray();
// Keep going
return RedirectToAction ...;
}
return View...;
}
}
Ответ №2:
Здесь нет никаких таблиц и строк. Ваш код создает несколько отдельных форм, и когда вы отправляете, вы просто отправляете одну из форм, и вы должны рассматривать отправку как FormCollection