Вы не можете использовать проверенные данные запроса (например, Request.Form
, Request.QueryString
) внутри своего провайдера пользовательских значений, если вам нужно обрабатывать «потенциально опасные» данные.
Вместо этого вы должны использовать методы или свойства, такие как Request.Unvalidated
, HttpContext.Request.Unvalidated()
или HttpContext.Request.InputStream
.
Если вы внедрите IUnvalidatedValueProvider
в свой пользовательский ValueProvider
, то он также может прекрасно работать с DefaultModelBinder
/ AllowHtml
.
IUnvalidatedValueProvider
имеет перегруженный метод GetValue
, чтобы сообщить провайдеру, следует ли пропустить проверку (что в конечном итоге устанавливается AllowHtml
).
public interface IUnvalidatedValueProvider : IValueProvider
{
ValueProviderResult GetValue(string key, bool skipValidation);
}
В вашей реализации, если skipValidation
истинно, вы должны получить данные неподтвержденного запроса. Очевидно, что в пределах вашего ContainsPrefix
вы не можете получить доступ к проверенным данным (например, Request.Form
).
Сказав, что, возможно, проще всего унаследовать от NameValueCollectionValueProvider
, который уже "не подтвержден". Большинство встроенных поставщиков значений наследуются от него. Я связался с исходным кодом MVC ... посмотрите, как реализованы подтипы.