MVC DropDownListFor - Должен ли я вручную заново заполнять параметры после сбоя проверки? - PullRequest
7 голосов
/ 14 ноября 2010

У меня есть класс viewmodel, который содержит несколько свойств. По сути, текущая запись (которую редактирует пользователь) и список параметров (который используется для заполнения выпадающего списка с помощью DropDownListFor).

После отправки формы, если состояние модели недействительно, я возвращаюсь к представлению. Я понимаю, что форма заполняется с использованием 'отклоненного' ввода из ModelState["name"].Value.AttemptedValue, но я не уверен, что делать со списком значений для выпадающего списка.

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

Это правильный путь или я упускаю более очевидный способ сохранения выпадающих значений?

Ответы [ 2 ]

10 голосов
/ 15 ноября 2010

Да, это правильный путь, если вы намереваетесь вернуть то же представление в действии POST:

  1. связать список в действии GET из базы данных
  2. отобразить представление
  3. пользователь отправляет форму в действие POST
  4. . В этом действии вы выбираете только выбранное значение, поэтому, если модель недействительна, и вам нужно снова отобразить представление, вам необходимо получить список обратно.из базы данных, чтобы заполнить вашу модель представления.

Вот пример часто используемого шаблона в MVC:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Items = _repository.GetItems()
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        if (!ModelState.IsValid) 
        {
            // Validation failed, fetch the list from the database
            // and redisplay the form
            model.Items = _repository.GetItems();
            return View(model);
        }
        // at this stage the model is valid => 
        // use the selected value from the dropdown
        _repository.DoSomething(model.SelectedValue);
        // You no longer need to fetch the list because
        // we are redirecting here
        return RedirectToAction("Success", "SomeOtherController");
    }
}
0 голосов
/ 07 февраля 2018

Вы можете использовать xhr ajax call для отправки ваших данных вместо отправки формы с помощью кнопки отправки по умолчанию.

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

На стороне клиента и после обратного вызова ajax вы можете решить, делать ли что-либо, проверяя значение status

$.ajax({
    url: '@Url.Action("Index", "Controller")',
    data: $("#form").serialize(),
    type: 'POST',
    success: function (data) {
        if (data.status == "Successful") {
            // you can redirect to another page by window.location.replace('New URL')
        } else {
            // you can display validation message
        }
    }
});

Ваш ActionMethod будет похож на:

[HttpPost]
        public JsonResult Index()
        {
            if (ModelState.IsValid)
            {
                return Json(new { status = "Success" });    
            }
            else
            {
                return Json(new { status = "Fail" });
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...