ASP.NET проблема с выбранным значением MVC DropDownList

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

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

моя проблема заключается в следующем: У меня 2 кнопку Submit, На следующей странице и одна на страницу Пред. В контроллере, если один из отправка была нажата, страница# должна быть увеличена или уменьшена на 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 из Pro ASP.NET MVC Framework by Steven Sanderson:

Как Контролирует Ввод Их Значений

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

  1. ViewData.ModelState ["controlName"].Значение.RawValue
  2. параметр value передается вспомогательному методу HTML, или если вы вызвали перегрузка, не включающая значение параметр, тогда ViewData.Eval ("controlName")

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

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

4 ответов


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

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

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

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


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


  1. вы уверены, что вам гарантировано, что хотя бы один из NextPage или PrevPage будет null? (И вы не получите ничего странного, как String.Empty форсирование приращения и уменьшения?)
  2. мог бы .LastOrDefault() заменить на just .Last() и вы уверены, что вы не назначая default(int) to search.Page?

тут ниже есть ли эффект?

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

замена

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