ASP.NET MVC 5 Сохранение старого ввода между запросами - PullRequest
0 голосов
/ 13 мая 2018

Мне нужна функция, которая похожа на старый помощник ввода Laravel, но в MVC 5. https://laravel.com/docs/5.6/requests#old-input

Если проверка не пройдена, мне нужно перезагрузить все данные моей модели, как это было в предыдущем запросе, кроме тех входов, где пользователь ввел что-то неправильное.

Проблема в том, что в моей форме есть много отключенных входов и полей, которые программа выбирает в методе [HttpGet], и они теряются во время отправки. Поэтому мне нужно хранить их в сессии.

Кажется, что приведенный ниже код работает, но есть ли более эффективный и красивый способ сделать это с меньшим количеством кода в каждом контроллере?

[HttpGet]
[Route(@"TaskManagement/Edit/{guid}")]
public async Task<ActionResult> Edit(Guid guid)
{
    var model = new EditTaskViewModel(); 
    model.Guid = guid;

    await model.GetTaskFromRemoteService(new UserInfo(User));

    ControllerHelpers.DisplayAlerts(model, this);

    TempData["OldModel"] = model;

    return View(model);                
}


[HttpPost]
[ValidateAntiForgeryToken]
[Route(@"TaskManagement/Edit/{guid}")]
public async Task<ActionResult> Edit(EditTaskViewModel model, Guid guid, string submit)
{
    model.Guid = guid;

    if (ModelState.IsValid) {
        await model.UpdateTaskInRemoteService(new UserInfo(User), submit);
        ControllerHelpers.DisplayAlerts(model, this, "Task successfully updated");

        if (model.ErrorCode == null)
            return RedirectToAction("Edit", new { guid = model.Guid });

        return RedirectToAction("Index");
    }


    if (TempData["OldModel"] != null) {
        model = (EditTaskViewModel)TempData["OldModel"];
    }
    return View(model);

}

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Я думаю, что ответ был довольно прост. Самый короткий и простой способ - снова заполнить объект из базы данных \ удаленной службы.

Поля, введенные пользователем, действительны они или нет, останутся прежними. Остальные загрузятся еще раз.

0 голосов
/ 13 мая 2018

Использование состояния сеанса (включая TempData) может привести к сбоям при открытии нескольких копий страницы. Вы можете обойти это, сгенерировав уникальный идентификатор для ключа сеанса и сохранив его в скрытом поле .

Однако я бы постарался вообще не использовать сессию.

Простой подход заключается в использовании скрытых полей для хранения значений, которые не отправляются на сервер, поскольку они находятся в отключенных полях.

Более надежный подход - это отдельный класс (или, по крайней мере, частный метод), который знает, как настроить вашу модель в первый раз и при переходе (например, неудачная проверка сервера). Я называю эти классы «композиторами» и описываю подход здесь .

Псевдокод того, как может выглядеть метод действия с композитором:

if( ModelState.IsValid ){
    return Redirect();
}

var rebuiltModel = _composer.ComposeEdit( incomingModel );
return View( rebuiltModel );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...