MVC Core - странная проблема рендеринга вида - PullRequest
0 голосов
/ 03 июля 2018

Я использую MVC для отображения простой формы в виде:

ViewModel:

public class CreateSaleViewModel
{
    public string OrderId { get; set; }

    public decimal TotalAmount { get; set; }

    public bool ShowInstoreConfirmDetails { get; set; }
}

Действие контроллера:

[HttpGet]
public IActionResult CreateSale()
{
    return View(new CreateSaleViewModel());
}

Вид:

@model CreateSaleViewModel
<form asp-controller="Sales" asp-action="CreateSale" method="post">

  <input asp-for="OrderId" />
  <input asp-for="TotalAmount" />

  <button type="submit" name="CreateSale" id="CreateSale">
    button
  </button>

</form>

Затем я публикую сообщение в новом представлении, в котором необходимо ввести те же данные. Для этого я сохраняю старые значения в скрытых входах и предоставляю другую форму для повторного ввода данных.

ViewModel:

public class ConfirmDetailsViewModel
{
    public string OrderId { get; set; }

    public decimal TotalAmount { get; set; }

    public string ConfirmOrderId { get; set; }

    public decimal ConfirmTotalAmount { get; set; }
}

Контроллер:

[HttpPost("Confirmdetails")]
public IActionResult ConfirmDetails(CreateSaleViewModel model)
{
 var viewModel = new ConfirmDetailsViewModel
 {
    ConfirmOrderId = model.OrderId,
    ConfirmTotalAmount = model.TotalAmount,
    OrderId = string.Empty,
    TotalAmount = 0.0m
  };

  return View("ConfirmDetails", viewModel);
}

Вид:

@model ConfirmDetailsViewModel

<form asp-controller="Sales" asp-action="Summary" method="post">
  <input type="hidden" value="@Model.ConfirmOrderId" id="OrderIdConfirm" />

  <input type="hidden" value="@Model.ConfirmTotalAmount" id="TotalAmountConfirm" />

  <input type="hidden" value="@Model.OrderId" id="banana" />


  <input asp-for="OrderId" />

  <input asp-for="TotalAmount" />

  <button  type="submit" name="CreateSale" id="CreateSale">
    button
  </button>
</form>

Моя проблема заключается в представлении orderDid для подтверждения подробностей, и TotalAmount сохраняет значения, опубликованные на предыдущей странице.

Я отладил контроллер и вижу, что свойства ConfirmOrderId и ConfirmTotalAmount имеют правильные значения, а также OrderId и TotalAmount - пустые слова и 0 соответственно.

Даже странно, что

<input type="hidden" value="@Model.OrderId" id="banana" />

Имеет правильное значение "".

Кто-нибудь знает, что является причиной этой проблемы?

1 Ответ

0 голосов
/ 03 июля 2018

MVC сохраняет объявленные значения обратно в ModelState .

Эти значения по умолчанию используются в помощниках @Html - для удобства. Это позволяет сохранять значения скрытых полей формы с помощью обратных передач, даже если они не имеют свойств в модели представления.

К сожалению, обычно удобство превращается в головную боль, если вы пытаетесь изменить свойства модели в действии. Помощники берут свои значения из ModelState, игнорируя обновленную модель представления.

Чтобы решить эту проблему, вызовите ModelState.Clear ()

  • удаляет все опубликованные обратные значения из ModelState
  • помощники теперь будут использовать значения из модели представления.

Контроллер:

    [HttpPost]
    public IActionResult ConfirmDetails(CreateSaleViewModel model)
    {
        var viewModel = new ConfirmDetailsViewModel
        {
            ConfirmOrderId = model.OrderId,
            ...
        };

        ModelState.Clear();        // force asp-helpers to use the updated model's values

        return View("ConfirmDetails", viewModel);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...