Решение и резюме:
Проблема возникает, когда пришло время кодировать кнопку отправки. Наши кнопки генерируются как <button ... ><span> Submit</span></button>
; когда пришло время создавать запрос, все остальные браузеры, включая IE8, достаточно умны, чтобы принимать только «Отправить». IE7 отправляет весь внутренний HTML. У нас была эта ошибка в других контекстах, но на этот раз я получил неверный путь из-за ошибки JSON.
Я не могу и не буду переходить с <% Http.Button %>
на вход; это вне меня, как это можно даже считать жизнеспособным решением; это расширение используется по очень веским причинам, и если бы я отказался от него, я бы не стал задавать этот вопрос.
Решение заключалось в добавлении нового фильтра, расширяющего RequestValidator
, и проверке запроса на тег span
, вызывающий сбой; если найдено, заменить текстом.
public class HttpRequestValidator : RequestValidator
{
protected override bool IsValidRequestString(
HttpContext context,
string value,
RequestValidationSource requestValidationSource,
string collectionKey,
out int validationFailureIndex)
{
// Check if the Request.QueryString contains a post value of "<span>.....</span>"
if (requestValidationSource == RequestValidationSource.Form
&& !string.IsNullOrEmpty(value) && value.StartsWith("<span>",
StringComparison.InvariantCultureIgnoreCase))
{
var match = Regex.Match(value, @"\A<span>(.*?)</span>\Z",
RegexOptions.IgnoreCase);
if (match.Success && match.Groups.Count > 1)
return base.IsValidRequestString(
context, match.Groups[1].Value,
requestValidationSource,
collectionKey,
out validationFailureIndex);
}
return base.IsValidRequestString(
context,
value,
requestValidationSource,
collectionKey,
out validationFailureIndex);
}
}
Вам также необходимо добавить его в web.config
; найдите httpRuntime
и замените его на
<httpRuntime requestPathInvalidCharacters="<,>,*,%,:,\"
requestValidationType=" ... .HttpRequestValidator"
maxRequestLength="40920" maxQueryStringLength="10000"/>