Я использую ASP.NET MVC и хотел бы, чтобы все введенные пользователем строковые поля были обрезаны до того, как они будут вставлены в базу данных. И поскольку у меня много форм ввода данных, я ищу элегантный способ обрезки всех строк вместо явного обрезания каждого предоставленного пользователем строкового значения. Мне интересно знать, как и когда люди обрезают струны.
Я подумал о том, чтобы, возможно, создать собственный механизм связывания модели и обрезать там любые строковые значения ... таким образом, вся моя логика обрезки содержится в одном месте. Это хороший подход? Есть ли примеры кода, которые делают это?
asp.net
asp.net-mvc
model-binders
Джонни Ошика
источник
источник
type="password"
входы нетронутыми?Это @takepara того же разрешения, но как IModelBinder вместо DefaultModelBinder, так что добавление modelbinder в global.asax происходит через
Класс:
на основе сообщения @haacked: http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx
источник
return
операторов и отменив условие:if (valueResult == null || string.IsNullOrEmpty(valueResult.AttemptedValue)) return null;
[AllowHtml]
атрибут свойств модели (наряду с тем,[ValidateInput(false)]
что CodeGrue упомянул вышеОдно улучшение @takepara ответа.
Кто-то был в проекте:
В TrimModelBinder изменение класса
в
и вы можете пометить свойства, которые будут исключены из обрезки, с помощью атрибута [NoTrim].
источник
.Cast<object>().Any(a => a.GetType() == typeof(NoTrimAttribute))
с.OfType<NoTrimAttribute>().Any()
. Просто немного чище.С улучшениями в C # 6 теперь вы можете написать очень компактную модель связующего, которая будет обрезать все строковые входы:
Вам нужно включить эту строку где-нибудь в
Application_Start()
вашемGlobal.asax.cs
файле, чтобы использовать связыватель модели при связыванииstring
s:Я считаю, что лучше использовать связыватель модели, подобный этому, а не переопределять связыватель модели по умолчанию, потому что тогда он будет использоваться всякий раз, когда вы связываете объект
string
, будь то непосредственно как аргумент метода или как свойство класса модели. Однако, если вы переопределите связыватель модели по умолчанию, как предлагают другие ответы, это будет работать только при привязке свойств к моделям, а не когда у вас естьstring
аргумент метода действияРедактировать: комментатор спросил о ситуации, когда поле не должно быть проверено. Мой первоначальный ответ был сведен только к вопросу, поставленному OP, но для тех, кто заинтересован, вы можете справиться с проверкой, используя следующую расширенную модель связующего:
источник
В ASP.Net Core 2 это работало для меня. Я использую
[FromBody]
атрибут в моих контроллерах и входных данных JSON. Чтобы переопределить обработку строк в десериализации JSON, я зарегистрировал свой собственный JsonConverter:И это конвертер:
источник
Другой вариант ответа @ takepara, но с другим поворотом:
1) Я предпочитаю opt-in "StringTrim" механизм атрибута (а не opt-out "NoTrim" пример @Anton).
2) Требуется дополнительный вызов SetModelValue, чтобы убедиться, что ModelState заполнен правильно, и шаблон проверки / принятия / отклонения по умолчанию можно использовать как обычно, т. Е. TryUpdateModel (модель) для применения и ModelState.Clear () для принятия всех изменений.
Поместите это в вашу сущность / общую библиотеку:
Тогда это в вашем приложении / библиотеке MVC:
Если вы не установите значение свойства в связывателе, даже если вы не хотите ничего менять, вы полностью заблокируете это свойство из ModelState! Это потому, что вы зарегистрированы как связывающие все типы строк, поэтому (в моем тестировании) кажется, что связыватель по умолчанию не сделает это за вас.
источник
Дополнительная информация для тех, кто ищет, как это сделать в ASP.NET Core 1.0. Логика изменилась довольно сильно.
Я написал пост в блоге о том, как это сделать , он объясняет вещи немного более подробно
Итак, решение ASP.NET Core 1.0:
Модель связующего, чтобы сделать фактическую отделку
Кроме того, вам нужен Model Binder Provider в последней версии, это говорит о том, что следует использовать это связующее для этой модели
Тогда это должно быть зарегистрировано в Startup.cs
источник
Читая превосходные ответы и комментарии выше, и становясь все более запутанным, я вдруг подумал: эй, мне интересно, есть ли решение jQuery. Поэтому для других, которые, как и я, находят ModelBinder'ов немного смущающими, я предлагаю следующий фрагмент jQuery, который обрезает поля ввода перед отправкой формы.
источник
В случае MVC Core
Связующее:
Поставщик:
Функция регистрации:
Регистр:
источник
SimpleTypeModelBinderProvider
, поддерживая тот же индекс.Поздно, но ниже приводится сводная информация о корректировках, требуемых для MVC 5.2.3, если вы хотите выполнить
skipValidation
требование встроенных поставщиков стоимости.Global.asax
источник
Я не согласен с решением. Вы должны переопределить GetPropertyValue, потому что данные для SetProperty также могут быть заполнены ModelState. Чтобы поймать необработанные данные из элементов ввода, напишите это:
Фильтруйте по свойству propertyDescriptor PropertyType, если вас действительно интересуют только строковые значения, но это не должно иметь значения, потому что все, что входит, в основном является строкой.
источник
Для ASP.NET Core замените
ComplexTypeModelBinderProvider
провайдера, который обрезает строки.В
ConfigureServices
методе кода запуска добавьте это:Определите
TrimmingModelBinderProvider
так:Уродливая часть этого - копирование и вставка
GetBinder
логикиComplexTypeModelBinderProvider
, но, похоже, нет никаких ловушек, которые позволили бы вам этого избежать.источник
Я создал поставщиков значений для обрезки значений параметров строки запроса и значений формы. Это было проверено с ASP.NET Core 3 и работает отлично.
Затем зарегистрируйте фабрики поставщиков значений в
ConfigureServices()
функции в Startup.csисточник
Было много постов, предлагающих атрибутивный подход. Вот пакет, который уже имеет атрибут обрезки и многие другие: Dado.ComponentModel.Mutations или NuGet
После вызова Mutate (), user.UserName будет преобразовано в
m@x_speed.01!
.Этот пример урезает пробелы и переводит строку в нижний регистр. Это не вводит проверки, но
System.ComponentModel.Annotations
может использоваться вместе сDado.ComponentModel.Mutations
.источник
Я разместил это в другой теме. В asp.net core 2 я пошел в другом направлении. Вместо этого я использовал фильтр действий. В этом случае разработчик может установить его глобально или использовать в качестве атрибута для действий, которые он / она хочет применить для обрезки строки. Этот код выполняется после привязки модели и может обновлять значения в объекте модели.
Вот мой код, сначала создайте фильтр действий:
Чтобы использовать его, либо зарегистрируйтесь как глобальный фильтр, либо украсьте свои действия атрибутом TrimInputStrings.
источник