Шаблон для управления идентификаторами и постоянного ввода пользователя для всей таблицы HTML одновременно - PullRequest
1 голос
/ 29 августа 2009

... означает pattern в общем английском языке, не относится к шаблонам проектирования ОО. Имеется таблица, подобная следующей (использующая <%%> в качестве общих тегов серверного сценария):

<form action="someUri" method="post">
<table>
    <thead>
        <tr>
            <td>Widget ID</td>
            <td>Description</td>
            <td>Price</td>
        </tr>
    </thead>
    <tbody>
    <% foreach widget in widgets %>
        <tr>
            <td>
                <!-- input ids need to be mangled
                        to preserve uniqueness -->
                <input type="hidden" id="[Some_Mangled_Input_Id]" 
                    value="<%= widget.Id %>" />
                <%= widget.Id %>
            </td>
            <td>
                <!-- prefill if exists for widget -->
                <input type="text" id="[Some_Mangled_Input_Id]"
                    value="<%= widget.Description %>" />
            </td>
            <td>
                <!-- prefill if exists for widget -->
                <input type="text" id="[Some_Mangled_Input_Id]"
                    value="<%= widget.Price %>" />
            </td>
        </tr>
    <% end foreach %>
    </tbody>
</table>

<input type="submit" value="Save Changes" />
</form>

А на сервере на посту:

    var widgetIdKeys = all keys in forms collection matching
        pattern of mangled input Id for Widget.Id hidden input

    foreach widgetIdKey in widgetIdKeys

        find matching mangled input Id for Widget.Description text input

        find matching mangled input Id for Widget.Price text input

        if input changed per comparison to some original

            persist Description and Price input for current widget Id

        end if

    end foreach

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

Или я вообще упускаю подходящую парадигму? Спасибо за любые идеи.

Ответы [ 2 ]

2 голосов
/ 29 августа 2009

Возможно, вы захотите использовать name вместо id для ввода.

http://www.mail-archive.com/wsg@webstandardsgroup.org/msg27766.html

Имя и идентификатор служат двум различным целям. ID используется для идентификации узел элемента в документе. Имя используется для идентификации элемента значение в форме отправки отправляется обратно на сервер.


Вы могли бы упростить вещи, используя массивы для ваших входных имен:

<% for (i=0; i<n; i++) { %>
<input type="hidden" name="id[i]" />
<input type="text" name="description[i]" />
<% } %>

Тогда на бэкэнде все входные данные были бы хорошо расположены в массивах (по крайней мере, в PHP).

Подробнее здесь .

0 голосов
/ 05 сентября 2009

Для полноты (не пытаясь получить свою награду, если это вообще возможно), вот как я в итоге занялся решением проблемы - мало чем отличающийся от оригинального подхода, просто более вменяемый в значительной степени из-за willollers answer , который поставил меня на правильный путь.

Добавляя счетчик строк в таблицу выше, я изменил исходный шаблон идентификатора ввода / имени так, чтобы входящие отправленные формы выглядели так:

<input name="widgets[0].Id" />
<input name="widgets[0].Description" />
<input name="widgets[0].Price" />
<input name="widgets[1].Id" />
<input name="widgets[1].Description" />
<input name="widgets[1].Price" />
<input name="widgets[2].Id" />
<input name="widgets[2].Description" />
<input name="widgets[2].Price" />

и т. Д.

Это именно то, что предписано ASP.Net MVC , как показано Скоттом Хансельманом здесь . Механизм связывания моделей ASP.Net MVC по умолчанию возьмет его оттуда и автоматически преобразует представление в строго типизированную коллекцию с именем widgets , , но, чтобы не затронуть этот вопрос как независимый от языка / фреймворка, я Я думаю, что выгода состоит в том, чтобы использовать соглашение об именовании входных данных, которое может быть легко проанализировано в коллекции, и сосредоточиться на абстрагировании этого шага. Из ответа Уилоллера эта задача прекрасно обрабатывается PHP, и я предполагаю, что в и другие платформы.

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