2010-12-03 4 views
0

Я работаю с ASP.NET MVC 2 и создаю простое бизнес-приложение. Вот некоторые детали:Как избежать потери состояния элементов управления в ASP.NET MVC

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

  • Я использую viewmodels. Рабочий заказ индексный указатель имеет вид модели с свойствами для каждого контроля.

  • Я реализовал пейджинг, похожий на то, что делается в ответ на этот вопрос: How do I do pagination in ASP.NET MVC? Я использую LINQ пропустим() и Take(), как продемонстрировали и ActionLinks для навигации ,

  • Если я загрузить страницу и не манипулировать какой-либо из элементов управления, я могу нажмите на номер страницы ActionLinks и передвигаться только штрафом между страниц заказов на выполнение работ. Однако, если я что-то изменил, мои изменения теряются , когда я перехожу на другую страницу.

    Например, если я нахожусь на странице 1 и нажмите непроверенной флажок и нажмите на ссылку для стр.2, второй страницы результатов загрузит но флажок будет вернуться к его предыдущее состояние.

Я понимаю, почему это происходит, но мне интересно, что лучше всего делать с точки зрения дизайна.

Потенциальные решения я могу думать:

  1. Установите все контрольные значения в качестве маршрута значения в ActionLinks. Это кажется действительно неприятным и может привести к очень длинным URL-адресам или строкам запроса. На самом деле, теперь, когда я думаю об этом, это не сработает без возможности захвата контрольных значений.

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

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

Это кажется довольно распространенной проблемой, но ни один из этих вариантов не кажется совершенно правильным. Интересно, я что-то упустил.

ответ

0

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

<input id="page" name="page" type="hidden" value="" /> 

<p> 
    <% for (var i = 1; i <= (int)Math.Ceiling(Model.RowsMatchingCriteria/(double)Model.PageSize); i++) { %> 

     <%-- 
      If the page number link being rendered is the current page, don't add the href attribute. 
      That makes the link non-clickable. 
     --%> 
     <a class="pageLink" <%= i != Model.Page ? @"href=""javascript:void(0);""" : string.Empty %>><%: i %></a> 

    <% } %> 
</p> 

Затем я добавил следующий JQuery скрипт, который задает скрытое значение страницы и отправляет форму при нажатии на ссылку:

$(document).ready(function() { 

    $('.pageLink:[href]').click(function() { 
     $('#page').val($(this).text()); // Set hidden field value to the text of the page link, which is the page number. 
     $('form:first').submit(); 
    }); 

}); 

Проблема решена.

0

Разве вы не можете просто сохранить изменения в базу данных, когда пользователь переключает флажков (с помощью JQuery):

$("input[type=checkbox]").click(function() { 
    $.ajax({ 
      type: "POST", 
      url: "/ControllerName/SaveInfo?id=" + {id}, 
      success: function(){ 
       alert("Data Saved: " + msg); 
      } 
    }); 
}); 
+0

Нет, я не хочу сохранять состояние своих элементов управления в базе данных; это было бы неэффективно. Однако я использовал jQuery в конце. – 2010-12-03 20:07:18

0

Лучшая ставка заключается в том, чтобы эффективно имитировать область просмотра, «регистрируя» изменения в скрытом поле, когда пользователь разбивает страницы. Для этого:

1) Посмотрите, какие данные вам нужно захватить, и формат данных для этого в {ie - массив объектов json} 2) Настройте ссылку, которая обрабатывает превью/рядом с огнем с помощью метода сбора «измененных» вещей и наложения их на объекты и в скрытое поле.
3) При отправке формы проанализируйте скрытое поле, извлеките данные и получите прибыль.

+0

См. Мой ответ выше. То, что я сделал, несколько схож с этим, за исключением большинства из них автоматически из-за «соглашения о конфигурации ASP.NET MVC». Скрытое поле (и все остальные элементы управления) имеют соответствующие свойства в viewmodel. Поэтому, когда я делаю submit, они автоматически связаны. – 2010-12-03 23:03:08

Смежные вопросы