Определение, какие флажки не отмечены в ASP.NET MVC? - PullRequest
0 голосов
/ 29 октября 2009

Представьте себе страницу, которая использует флажки для отслеживания подписок на рассылку о домашних животных:

cats-list ( )
dogs-list (*)
birds-list ( )
horses-list (*)

Я использую метод расширения Html.Checkbox в ASP.NET MVC в цикле (не показан):

<%= Html.Checkbox("subscriptions[" + i +"]", item.subscribed, item.listName) %>

«i» - переменная итерации в цикле. Использование этого соглашения позволяет моему действию контроллера связать модель subscriptions[i] с List<string>, которая затем содержит список имен списков рассылки для подписки.

Как я могу отслеживать, что не проверено? Например, если пользователь снимает флажок «список собак», чтобы отписаться от этого списка, как я могу сказать? Я верну «ложь» только из скрытого поля формы.

РЕДАКТИРОВАТЬ: Единственное решение, которое приходит на ум, это для действия контроллера отписаться от всех списков рассылки, а затем повторно подписаться на списки, содержащиеся в List<string> от флажков. Это не идеально, хотя.

1 Ответ

2 голосов
/ 29 октября 2009

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

например. (воздушный код)

List<string> selectedSubscriptions; //This is passed in from the form using the model binder
List<string> mailingListsToRemove = GetCurrentMailingLists(); //Looks odd but bear with me
List<string> mailingListsToAdd = new List<string>();

//Loop through all the mailing lists they had selected
foreach (string selectedMailingList in selectedSubscriptions)
{
    //if the mailing list exists in the list to remove, remove it from that list
    //because they obviously don't want it removed
    //Remember that this list also contains their current lists.
    if (mailingListsToRemove.Contains(selectedMailingList))
    {
        mailingListsToRemove.Remove(selectedMailingList);
    }
    else //If it's not in the list to remove then add it
    {
        mailingListsToAdd.Add(selectedMailingList);
    }
}

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

HTHS
Charles

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...