MVC3 DropDownListFor выбранное значение не изменяется при установке в действии обратной передачи

Я прочитал здесь много сообщений о проблемах с выбранным значением в раскрывающемся списке (не показывает и т. Д. И т. Д.), Но у меня противоположная проблема.

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

Мой взгляд:

@Model.PspSourceModel.PayAccount.PaymentProviderId
<br />
@Html.DropDownListFor(
        x => x.PspSourceModel.PayAccount.PaymentProviderId,
            new SelectList(Model.PspSourceModel.PaymentProviders, "Value", "Text", "-- please select --"),
    "-- please select --"

Мой контроллер:

// I've tried forcing the selected value id here - doesn't effect the dropdownlist still?
pspVM.PspSourceModel.PayAccount.PaymentProviderId = 1;

return (View(pspVM));

Моя веб-страница показывает:

1 (the id I set in the Action)

dropdownlist with the id=6 or whatever value was chosen prior to submitting the form.

Из вопросов и ответов на SO и в более широкой сети я подумал, что раскрывающийся список кажется привязанным к выбранному вами идентификатору, но как мне переопределить это, чтобы каждый раз сбрасывать раскрывающийся список на «пожалуйста, выберите»?

Заранее спасибо.


person BarryFanta    schedule 25.11.2011    source источник
comment
Просто нашли способ сделать это, но открыты для лучших предложений? // если я сначала очищаю, а затем устанавливаю несуществующий идентификатор (-1), по умолчанию будет использоваться «пожалуйста, выберите» My Controller: code ModelState.Clear(); pspVM.PspSourceModel.PayAccount.PaymentProviderId = -1; возврат (Просмотр(pspVM)); code Все равно спасибо.   -  person BarryFanta    schedule 25.11.2011


Ответы (2)


Фундаментальная проблема здесь заключается в том, что когда MVC перепривязывает форму при обратной передаче, он использует не Model, а ModelState, поэтому вы можете изменять свою модель сколько угодно, но будет использоваться только связанный ModelState. Вы пробовали какой-либо из этих методов в ModelState?

 public bool Remove(string key);
 public void SetModelValue(string key, ValueProviderResult value);
person Rob Kent    schedule 25.11.2011

В вашем действии с обратной передачей вы можете обработать текущее значение по мере необходимости и либо установить идентификатор в модели, либо вызвать представление;

[HttpPost]
public ActionResult Index(ModelClass viewModel)
{
  // Process Value

  viewModel.PspSourceModel.PayAccount.PaymentProviderId = 6;
  return View("Index", viewModel);
}

Или вы можете установить значения по умолчанию в своем HttpGet и вызвать результат RedirectToAction в своем сообщении.

[HttpGet]
public ActionResult Index()
{
  // Set the default values; the following is a rough example, and won't work.
  var viewModel = new ModelClass
  {
    PspSourceModel.PayAccount.PaymentProviderId = 6
  }

  return View("Index", viewModel);
}

[HttpPost]
public ActionResult Index(ModelClass viewModel)
{
  // Process Value

  return RedirectToAction("Index");
}

Я надеюсь, что это ясно, если вам нужна дополнительная помощь, пожалуйста, дайте мне знать.

Мэтт

person Matt Griffiths    schedule 25.11.2011
comment
Спасибо, Мэтт, ваше предложение HTTPost было именно тем, что я делал. Каким-то образом установка идентификатора не решает мою проблему. Я также не могу выполнить ваше решение для перенаправления, так как у меня там есть другие вещи, и логика, позволяющая избежать этого, станет беспорядочной. Судя по моему первоначальному комментарию, это проблема ModelState. Спасибо, в любом случае - person BarryFanta; 25.11.2011