Pull to refresh

Comments 12

спасибо за статью, думаю описанная проблема довольно распространена, хотя мне пока не доводилось сталкиваться.
хотел попросить: перенесите пост в блог .net или asp.net mvc, ведь посты личного блога не выходят на главную
Да, интересный самописный способ, но зачем если Action может принимать в качестве параметра массив или перечисление, а ещё словарь, если не ошибаюсь. Встаёт только 1 проблема во всех этих методах получения динамической формы, как это проверить(валидация) и показать пользователю на ошибки.
извините, немного поспешил, подумал по это фразе: Напишем свою версию обработки данных (ModelBinder), что далее будет написание модел биндера который парсет ту же коллекцию формы.
В классе надо реализовать IDataErrorInfo, например:
public class Ownership : IDataErrorInfo
{
...
public string this[string columnName]
{
get
{
if ((columnName == "Price") && (Price < 0))
return "Цена не может быть меньше 0";
return null;
}
}
}

А во View в foreach:
<%= Html.ValidationMessage("Ownerships[" + index.ToString() + "].Price")%>
Спасибо большое. Просто сталкивался с такой проблемой в ASP.Net MVC preview 2, тогда ещё не было ModelState.AddError()…
да ещё можно использовать плагин docs.jquery.com/Plugins/Validation, там реализован метод аля String.Format(); что упростит написание добавления и использовать определения правил валидации через css классы и атрибуты поля ввода.
ну то что вы предложили легко можно обойти, а при IDataErrorInfo проверка идет на сервере, поэтому безопаснее
то что я предлагаю касается только клиентской валидации.
Аналогично можно привязать и к словарям. Например если есть Dictionary<string,Person> people, то можно писать так:
people[0].key
people[0].value.Name
people[0].value.Email

главное, чтоб индексация начиналась с 0 и была не разрывная.
В исходниках MVC Framework 2 можно посмотреть, что DefaultModelBinder использует для коллекции индексов IEnumerable`string (а не int), и этот список получается в GetIndexes, которая имеет две ветки, где вариант с нумерацией используется только в том случае, если не удался более продвинутый: с поиском индексов в post-запросе.

Пример из топика можно модифицировать, добавив дополнительный hidden для каждого Ownerships, который будет иметь имя Ownerships.index (одинаковый для всех) и содержать уникальный индекс — хоть произвольное число, хоть guid. И не нужно заботиться о разрывах в нумерации.

Специально проверил на Вашем примере — работает:
<%= Html.Hidden(«Ownerships.index», «abcdef»)%>
Name: <%= Html.TextBox(«Ownerships[abcdef].Name»)%>
Price: <%= Html.TextBox(«Ownerships[abcdef].Price»)%>

<%= Html.Hidden(«Ownerships.index», «suygauyg»)%>
Name: <%= Html.TextBox(«Ownerships[suygauyg].Name»)%>
Price: <%= Html.TextBox(«Ownerships[suygauyg].Price»)%>
Прикольно. А в первом MVC такого нет?
Нет, к сожалению, в первом MVC только по численным индексам с непрерывной нумерацией от 0.
Sign up to leave a comment.

Articles