Всякий раз, когда я отправляю форму методу действия Edit
на моем контроллере, без какой-либо записи или с недопустимой записью, он выдает сообщение об ошибке, как и ожидалось.Однако я теряю и все остальные данные.Я ищу способ сохранить введенные данные, даже если ModelState
недействительно.Ниже мой код:
Viewmodel
public class EditOrderViewModel
{
[Required(ErrorMessage = "Must Provide Order Number")]
public string OrderNumber { get; set; }
public int OrderId { get; set; }
public int CustomerId { get; set; }
public int TrailerId { get; set; }
public List<SelectListItem> Trailers { get; set; }
public List<SelectListItem> Customers { get; set; }
public EditOrderViewModel()
{
}
public EditOrderViewModel(Order orderToEdit, IEnumerable<Trailer> trailers, IEnumerable<Customer> customers)
{
OrderNumber = orderToEdit.OrderNumber;
CustomerId = orderToEdit.CustomerId;
OrderId = orderToEdit.OrderID;
TrailerId = orderToEdit.TrailerId;
Trailers= new List<SelectListItem>();
foreach (var trailer in trailers)
{
Trailers.Add(new SelectListItem
{
Value = (trailer.TrailerID).ToString(),
Text = trailer.TrailerNumber
});
};
Customers = new List<SelectListItem>();
foreach (var customer in customers)
{
Customers.Add(new SelectListItem
{
Value = (customer.CustomerID).ToString(),
Text = customer.CustomerName
});
};
}
}
Контроллер
public IActionResult Edit(int id)
{
var orderToEdit = _context.Orders.Include(t => t.Trailer).Include( c => c.Customer).Where(o => o.OrderID == id).SingleOrDefault();
var trailers = _context.Trailers.Where(x => x.TrailerStatus == "Available" || x.TrailerID == orderToEdit.TrailerId).ToList();
var customers = _context.Customers.ToList();
EditOrderViewModel editOrderViewModel = new EditOrderViewModel(orderToEdit, trailers, customers);
return View(editOrderViewModel);
}
[HttpPost]
public IActionResult Edit(EditOrderViewModel editOrderViewModel)
{
Order order = _context.Orders.FirstOrDefault(o => o.OrderID == editOrderViewModel.OrderId);
Trailer newTrailer = _context.Trailers.FirstOrDefault(t => t.TrailerID == editOrderViewModel.TrailerId);
Trailer oldTrailer = _context.Trailers.FirstOrDefault(t => t.TrailerID == order.TrailerId);
if (ModelState.IsValid)
{
order.OrderNumber = editOrderViewModel.OrderNumber;
order.CustomerId = editOrderViewModel.CustomerId;
if (oldTrailer.TrailerID != newTrailer.TrailerID)
{
oldTrailer.TrailerStatus = "Available";
newTrailer.TrailerStatus = "Unavailable";
}
order.TrailerId = newTrailer.TrailerID;
_context.SaveChanges();
return Redirect("/Order");
}
return Redirect("/Order/Edit");
}
Страница просмотра бритвы
@model WebApplication1.ViewModels.EditOrderViewModel
@{
ViewData["Title"] = "Edit Order";
}
<h2>@ViewData["Title"]</h2>
<form asp-controller="Order" asp-action="Edit" method="post">
<fieldset>
@Html.HiddenFor(o => o.OrderId)
<div>
<label asp-for="@Model.OrderNumber">Order number </label>
<input asp-for="@Model.OrderNumber" />
<span asp-validation-for="@Model.OrderNumber"></span>
</div>
<div>
<label asp-for="@Model.TrailerId">Customers Name</label>
<select asp-for="@Model.TrailerId" asp-items="@Model.Trailers"></select>
<span asp-validation-for="@Model.TrailerId"></span>
</div>
<div>
<label asp-for="@Model.CustomerId">Customers Name</label>
<select asp-for="@Model.CustomerId" asp-items="@Model.Customers"></select>
<span asp-validation-for="@Model.CustomerId"></span>
</div>
<div>
<input type="submit" value="Update" name="submitButton" />
</div>
</fieldset>
</form>
<p> <a asp-controller="Order" asp-action="Index">Cancel</a> </p>
Я пробовал использовать
return Page(editOrderViewModel);
и
return RedirectToAction(editOrderViewModel);
оба метода возвращают страницу просмотра в исходное состояние, а это не ожидаемый результат.Я хочу иметь возможность видеть сообщение об ошибке со всеми действительными и недействительными данными на странице, чтобы иметь возможность исправить и повторно при необходимости.Как мне этого добиться?