Сохранение данных, даже если ModelState недействителен или одна обязательная запись пуста - PullRequest
0 голосов
/ 22 апреля 2019

Всякий раз, когда я отправляю форму методу действия 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);

оба метода возвращают страницу просмотра в исходное состояние, а это не ожидаемый результат.Я хочу иметь возможность видеть сообщение об ошибке со всеми действительными и недействительными данными на странице, чтобы иметь возможность исправить и повторно при необходимости.Как мне этого добиться?

1 Ответ

0 голосов
/ 22 апреля 2019

Мне просто пришлось заново заполнить данные, передать их в модель представления, а затем передать их обратно в представление

[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");
            }


            var orderToEdit = _context.Orders.Include(t => t.Trailer).Include(c => c.Customer).Where(o => o.OrderID == editOrderViewModel.OrderId).SingleOrDefault();

            var trailers = _context.Trailers.Where(x => x.TrailerStatus == "Available" || x.TrailerID == orderToEdit.TrailerId).ToList();

            var customers = _context.Customers.ToList();
            EditOrderViewModel repopulateViewModel = new EditOrderViewModel(orderToEdit, trailers, customers);
            return View(repopulateViewModel);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...