Ответ 1
Взгляните на блог Phil Haack, где он описывает, как привязать модель к списку.
Может это может помочь?
Мне нужно иметь возможность редактировать таблицу данных в браузере.
Я видел в MVCContrib есть HTML-помощник для визуализации таблицы. Полезно... но как насчет того, хочу ли я, чтобы пользователь мог редактировать эту таблицу? Из того, что я вижу, это не помогает.
Каков наилучший способ приблизиться к этому?
Традиционная форма с таблицей внутри? Если это MVC достаточно умный, чтобы проанализировать опубликованные данные обратно в коллекцию строк? Как это будет работать?
Или, возможно, он должен просто переключиться в режим редактирования, когда щелкнет строка (используя javascript и т.д.), а затем, когда пользователь переместится в другую строку, действие AJAX вызывается для отправки только одной строки. Я могу представить, что логика может быть сложной здесь - это, по-видимому, все еще будет использовать форму, но мне нужно будет динамически вставлять ее в DOM?
Мне также нужно иметь возможность добавлять строки в эту таблицу. Я не требую поддержки подкачки.
Есть ли решение на полке?
Должен ли я вернуться к веб-формам?:)
Взгляните на блог Phil Haack, где он описывает, как привязать модель к списку.
Может это может помочь?
У меня такая же проблема, и я нашел для нее решение. Не думаю, что это самое красивое, но оно идеально для меня, потому что одним из моих требований было возможность редактировать данные таблицы с помощью jQuery Jeditable.
Итак, я создаю таблицу, используя MVCContrib Grid < > extension:
Html.Grid<Somenamespace.Line>( Model.InvoiceLines )
.Attributes( id => "InvoiceGrid" )
.Columns( column => {
column.For( li => li.LineItem.ItemDescription ).Attributes( name => ".LineItem.ItemDescription", @class => "click" );
column.For( li => li.LineItem.InvoiceUnitNetPrice ).Named( "Unit net price " ).Attributes( name => ".LineItem.InvoiceUnitNetPrice", @class => "click" );
column.For( li => li.LineItem.InvoiceQuantity ).Attributes( name => ".LineItem.InvoiceQuantity", @class => "click" );
})
.Render();
//rest of the code
Html.Submit("_submit", "Save");
Теперь вы можете редактировать значения на месте, но не обновлять соответствующую модель. Вся магия происходит после нажатия кнопки отправки пользователем:
$(document).ready(function() {
$('#_submit').click(function(e) {
e.preventDefault();
$('#InvoiceGrid tbody tr').each(function(index) {
var hidden = $('<input />').attr({ type: 'hidden', name: 'InvoiceLines.Index', value: index });
$(this).children('td:first-child').before(hidden);
$(this).children('td:not(:first-child)').each(function() {
$(this).append($('<input />').attr({ type: 'hidden', value: $(this).text(), name: 'InvoiceLines[' + index + ']' + $(this).attr('name') }));
});
});
$('form').submit();
});
//editable stuff
$('.click').editable(function(value, settings) {
return (value);
}, { submit: 'OK' });
});
В каждом TD я создаю скрытый ввод, со значением из этого TD, в каждом вводе строки с индексом, а наиболее важным здесь является атрибут name: имя коллекции в модели [здесь идет индекс].rest.of. путь, поэтому в данном конкретном случае (пример):
InvoiceLines[2].LineItem.ItemDescription
Надеюсь, что это поможет, потому что богатая сетка - это не всегда ответ;)
Отношения Матеуш
Я бы сначала просмотрел одну из библиотек пользовательского интерфейса javascript:
WebForms проще, когда дело доходит до быстрой разработки богатых пользовательских интерфейсов, таких как редактируемые сетки.
Вчера вечером я реализовал простое решение: form + table inside, используя поля ввода в ячейках с соглашением об именах, как описано в блог Phil Haack (благодаря @BengtBe для ссылки).
Работает, но немного немного затруднительно (например, добавление строк с jquery требует от меня разбора следующего неиспользуемого индекса).
Итак, я все еще ищу больше решений.
Я обнаружил, что библиотека extjs, которая обеспечивает очень богатую сетку. Мне еще предстоит решить, есть ли простой способ отправить данные сетки на один из моих действий с контроллером, хотя...