Задача выбранного значения ASP.NET MVC DropDownList

Я прочитал тонну об этой проблеме, но не могу понять.

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

Моя проблема заключается в следующем: У меня есть две кнопки отправки, одна для следующей страницы и одна для предыдущей страницы. В контроллере, если одно из поданных было нажато, страница # должна увеличиваться или уменьшаться на 1. Это происходит, и отображается правильная страница данных. Но в раскрывающемся списке нет, НИКАКОЙ МАТЕРИ, ЧТО Я ДЕЛАЮ, отражают новый номер страницы, когда отображается представление.

В принципе, если выпадающий список изменяется пользователем, он будет отражать эти изменения, когда он будет отправлен обратно после отправки формы. Если я изменю страницу # программно, выпадающее меню не изменится, даже если отображается правильная страница данных.

Вот способ действия:

public ActionResult Results(TechSearch search, string NextPage, string PrevPage)
{
    if (NextPage != null) search.Page++;
    if (PrevPage != null) search.Page--;

    int resultCount = search.GetResultCount(Desk);

    List<int> pages = new List<int>();
    int pageCount = (int)Math.Ceiling((decimal)resultCount / search.PageSize);
    for (int i = 1; i <= pageCount; i++) pages.Add(i);        

    ViewData["pages"] = new SelectList(pages, search.Page);            
    ViewData["pageCount"] = pageCount;

    return View(search);
}

И вот соответствующая часть представления:

<input type="submit" value="<" name="PrevPage" />
Page
<%=Html.DropDownList("Page",(SelectList)ViewData["pages"]) %>
of
<%=ViewData["pageCount"]%>
<input type="submit" value=">" name="NextPage"  />

Пожалуйста, помогите.

ИЗМЕНИТЬ

Страница 333 из Про ASP.NET MVC Framework от Стивена Сандерсона:

Как входные элементы управления получают свои значения

Каждый из [помощников HTML для визуализации элементов управления вводом] пытается заполнить себя, ища ценность в следующих местах, в этом порядке приоритета:

  • ViewData.ModelState [ "CONTROLNAME" ]. Value.RawValue
  • параметр значения передан методу HTML helper, или если вы вызывали перегрузка, которая не включает значение параметр, тогда ViewData.Eval( "CONTROLNAME" )

ModelState - это область временного хранения что ASP.NET MVC использует для сохранения входящие попытки плюс привязка и ошибки проверки. Заметить, что его в верхней части списка приоритетов, поэтому его значения переопределяют все, что вы может быть явно задан. Это соглашение означает, что вы можете передать явное значение параметра, чтобы действовать как помощники значение по умолчанию или начальное значение; но когда рендеринг представления после сбой проверки, помощник будет сохранить любое введенное пользователем значение в предпочтение этому стандарту.

Я проверил, что ViewData.ModelState [ "Page" ]. Value.RawValue содержит номер неожиданной страницы, который пристает ко мне. Какой лучший способ обойти это?

Ответы

Ответ 1

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

Вот что я сделал в своем методе действий, чтобы исправить проблему:

ModelState.Remove("Page");
return View(search);

Мне интересно услышать другие способы решения моей проблемы.

Ответ 2

Измените выбранное значение на javascript при нажатии следующей или предыдущей кнопки, прямо перед отправкой.

Ответ 3

  • Вы уверены, что вам гарантировано, что хотя бы один из NextPage или PrevPage будет пустым? (И вы не получаете ничего странного, как String.Empty заставляя приращение и декременты?)
  • Можно ли заменить .LastOrDefault() на просто .Last(), и вы уверены, что не назначаете default(int) на search.Page?

Ответ 4

Имеет ли эффект ниже эффект?

ViewData["pages"] = new SelectList(pages, 
                                   pages.FirstOrDefault(p => p == search.Page ));

Замена

ViewData["pages"] = new SelectList(pages, search.Page);