2013-04-18 3 views
0

У меня есть проблема документально here и here и here и especially here где, в целях ASP.NET MVC4, функция HTML помощник @Html.HiddenFor(m => m.ID) будет использовать «неправильные» данные и привести к повреждению данных.Предотвратить использование функции HiddenFor MVC в

Это серьезная проблема, и принятое «решение» - это просто знать об этом и разрабатывать вокруг него. Я думаю, что это плохое решение. (Кстати, вместо этого мы используем что-то вроде этого: <input type="hidden" value="@Model.ID" />)

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

Как я могу исключить использование этой функции, чтобы избежать ошибок в будущем?
- это не наш код, поэтому мы не можем пометить его [Obsolete]
- мы можем переопределить HtmlHelper, но это очень много работы, чтобы устранить одну функцию
- я могу написать модульный тест, чтобы выбрать этот код с точки зрения? (и проверка отказа при обнаружении этого вызова)
- другие идеи?

+1

Вы хотите инструмент анализа кода, такие как FxCop, и создать правило, которое будет работать как часть процесса сборки. Я сомневаюсь, что есть способ сделать это в компиляции, такой как атрибут. –

ответ

3

Это не «проблема», это так, как это предположительно для работы. И это не просто HiddenFor, который делает это, каждый помощник сделает это. это способ, которым MVC предназначен для работы. Тот факт, что вы, похоже, не понимаете, как работает MVC, является реальной проблемой.

Это часть подсистемы ModelState, и вам разумно точно знать, как это работает. Да, это не всегда интуитивно, но гораздо лучше, что вы действительно знаете, как все работает, чем притворяться, что их не существует, потому что вы в конечном итоге кусаетесь другими способами с другими помощниками.

Но, если вы выбираете в противном случае, я хотел бы предложить настройки StyleCop, чтобы справиться с этой проблемой

+0

Мы знаем, как MVC предназначен для работы, и, как указывали другие, это неинтуитивно и может привести к повреждению данных, очень легко. Для нового члена команды он мог легко взорвать нашу систему. Проблема заключается в плохом дизайне в инструментах, которые мы используем. Поэтому нам нужно обойти их. –

+0

Stylecop - интересная идея. –

+0

@BobbyB - но, как я уже сказал, проблема затрагивает * ALL * помощников, а не только Hidden, поэтому я не вижу, что вы набираете, запрещая Hidden. –

1

Если вы хотите, чтобы некоторый инструмент статического анализа, вы мой взгляд на CodeContracts доступен также через Visual Studio Gallery + есть другие инструменты (оплачиваемые позиции, насколько я знаю).

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

Roslyn будет более подходящим для вас. Таким образом, вы можете исследовать свой AST и выяснить, есть ли какие-то вызовы этой нежелательной функции.

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

0

Я не уверен, если это поможет, но то, что я сделал, чтобы удалить HiddenFors в моем коде, чтобы осуществить своего рода ViewState. Модель сериализована для клиента, и мое связующее устройство модели настроено на десериализацию этого. Я поставил код на https://github.com/willseitz/ModelViewState. Это может помочь вам придумать общее решение.

0

Эрик прав, он должен работать так, выполняя HTTP POST. Вот хорошее объяснение: Blog link.В блоге предлагаются несколько решений, в том числе ваш Бобби Б :-)

Цитата из блога: «ASP.NET MVC предполагает, что если вы визуализируете представление в ответ на HTTP POST и используете Html Помощники, то вы, скорее всего, будете перерисовывать форму, которая не прошла проверку. Поэтому помощники Html действительно проверяют в ModelState значение, отображаемое в поле, прежде чем они будут выглядеть в модели. Это позволяет им повторно отображать ошибочные данные, которые были введенный пользователем, и соответствующее сообщение об ошибке, если необходимо. ... Html Helpers (то есть Html.Hidden и Html.TextBox) сначала проверяют ModelState ... и поэтому отображают значения, которые были получены действием, а не те, которые мы изменили. "

Благодаря nemesv и Rhys Stephens (stackoverflow link)