Запретить использование функции MVC HiddenFor

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

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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

Спасибо Немешу и Рису Стивенсу ( ссылка на stackru)

Другие вопросы по тегам