Поддерживать состояние динамического списка флажков в ASP.NET MVC - PullRequest
10 голосов
/ 20 июля 2010

У меня есть класс с именем «PropertyFeature», который просто содержит PropertyFeatureID и Description. Это правильная модель, созданная с помощью LINQ to SQL, сопоставленная с таблицей базы данных SQL Server. Пример экземпляра / строки будет:

PropertyFeatureID: 2
Description: "Swimming Pool"

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

<%foreach (var Feature in (ViewData["Features"] as IEnumerable<MySolution.Models.PropertyFeature>)) { %>
<%=Html.CheckBox("Features", new { @id = Feature.PropertyFeatureID, @value = Feature.PropertyFeatureID })%><label for="Feature<%=Feature.PropertyFeatureID%>"><%=Feature.Description%></label>
<%}%>

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

Я установил для «CheckBox» «name» значение «Features», чтобы все флажки отображались с одним и тем же именем, и связыватель моделей MVC объединяет их в одну коллекцию под названием «Features» при публикации формы. Это хорошо работает.

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

Я могу получить выбранные значения из моего метода Controller при нажатии кнопки, потому что я указал параметр как int [] Features.

Но проблема в том, что он не поддерживает состояние. То есть, когда я нажимаю кнопку отправки и страница перезагружается (с вновь отображенной формой), я хочу, чтобы все динамические флажки сохранили свой отмеченный статус (или нет). Все остальные поля, которые я создал с помощью Html.DropDownList и Html.TextBox, успешно сохраняют свои состояния без проблем на одной странице в той же форме.

Я часами читал все другие темы и статьи по аналогичным вопросам, и много говорят об использовании ICollection и IDictionary для объединения вещей и включения логического значения для каждого элемента, чтобы он мог поддерживать состояние флажка. Но я не на 100% понимаю, как использовать это в контексте моего личного примера. Я хотел бы сделать решение по-настоящему простым и не кодировать страницы новых классов только для того, чтобы поддерживать свое состояние флажка.

Какой самый чистый и правильный способ сделать это?

Ответы [ 2 ]

15 голосов
/ 21 июля 2010

Я получил его после долгих тренировок с различными подходами.

По мнению:

<%string[] PostFeatures = Request.Form.GetValues("Features");%>
<% foreach (var Feature in (ViewData["AllPropertyFeatures"] as 
                             IEnumerable<MySolution.Models.PropertyFeature>)) 
   { %>
    <input type="checkbox" name="Features"
        id="Feature<%=Feature.PropertyFeatureID.ToString()%>" 
        value="<%=Feature.PropertyFeatureID%>" 
        <%if(PostFeatures!=null) 
          {
             if(PostFeatures.Contains(Feature.PropertyFeatureID.ToString()))
             { 
                Response.Write("checked=\"checked\""); 
             }
          }
        %> />
    <label for="Feature<%=Feature.PropertyFeatureID%>">
          <%=Feature.Description%></label>   <%
   }  %>

В методе получения контроллера:

public ActionResult SearchResults(int[] Features)

Этот метод имеет ряд преимуществ:

  • Позволяет нажимать метки для переключения соответствующих флажков (удобство использования).
  • Позволяет методу Controller получать супер-аккуратный массив целых, который ТОЛЬКО содержит выбранные целые, а не целую кучу предметов, которые не были выбраны или содержат false / null / blank / 0 и т. Д.
  • Сохраняет проверенное состояние флажка при перезагрузке страницы, содержащей форму, т. Е. Выбор пользователя сохраняется.
  • Нет случайного / случайного типа = скрытые поля ввода, созданные из стандартного помощника ASP.Net MVC Html.CheckBox - я знаю, что он делает это по уважительной причине, но в данном случае они мне не нужны, так как я только хочу чтобы узнать, какие идентификаторы были выбраны и для того, чтобы они были в одном, tidy int [].
  • Никаких масс дополнительных раздутых серверных классов, помощников и прочего счастливого беспорядка, необходимых для достижения такой простой вещи.

Я бы порекомендовал этот подход всем, кто хочет самое чистое / безворотное решение для динамического списка флажков, где вам нужны идентификаторы, и вы просто хотите заняться бизнесом!

0 голосов
/ 20 июля 2010

Проблема в том, что когда вы отображаете свой список флажков, вы не устанавливаете ни один из них как выбранный.Вам нужно будет установить int[] Features в ViewData, а затем в цикле foreach проверить, находится ли идентификатор этой функции в массиве в ViewData.

что-то вроде:

<%=Html.CheckBox("Features", 
    ((int[])ViewData["SelectedFeatures"]).Contains(Feature.PropertyFeatureID),
    new { @id = Feature.PropertyFeatureID, @value = Feature.PropertyFeatureID })%

хотя я не проверял, так что это может быть не 100%.

...