Клиенты, усекающие строку запроса, вызывают исключение FormatException

Время от времени в Rentler мы видим ошибку

System.FormatException, String не был распознан как действительный логический тип

в нашем мониторинге здоровья. Оказывается, похоже, что наши клиенты иногда обрезают конец URL при копировании / вставке его в другом месте. Просто так получилось, что логический параметр имеет тенденцию находиться в конце строки, и когда клиент делится им через какую-то социальную сеть, мы получаем сообщения об ошибках.

https: //? {домен} / поиск с.и.д. = 17403777 &NID = 651 &Местонахождение = 840065 &propertytypecode = 1 &photosonly = Fals

Мы используем привязку модели для всего, поэтому яЯ не совсем уверен, как с этим бороться. Я мог бы изменить свойство на строку и попытаться проанализировать его в действии контроллера, но этонеряшливый. Есть ли какой-нибудь простой и удобный способ заставить связыватель модели выполнить TryParse () и просто разрешить false, если это возможно?т?

 Dusda15 окт. 2012 г., 19:57
Это то, что яЯ надеюсь, Громер. Это'Такая органичная, нечастая ошибка, но очень раздражающая.
 Bobson15 окт. 2012 г., 19:58
Как насчет создания перегрузки, которая имеетphotosonly в качестве строкового параметра вместо bool, который просто возвращает результат вызова нормального со значением false?
 balexandre15 окт. 2012 г., 19:58
Я знаю, что ваш вопрос специфичен для другой части, но для обмена и рассылки по электронной почте, почему бы и нетсократить URLЕсть десятки APIs для таких, и вы даже можете использовать свое собственное доменное имя. я используюbit.ly и я люблю это, и так мои пользователи ... в 2012 году, и мы до сих порсообщение" огромный URLс ...
 Gromer15 окт. 2012 г., 19:59
@Dusda, удалите домен в своем URL в вопросе, чтобы люди моглинажмите на нее (если вы неЯ не хочу, чтобы люди заходили на URL).
 Dusda15 окт. 2012 г., 20:00
Мы используем AddThis для нашего обмена, и он использует сокращатели URL-адресов в зависимости от социальной сети, которой делится пользователь. Однако эти ошибки, похоже, происходят от людей, которые напрямую копируют / вставляют URL, поэтому мы не можем его контролировать.
 Gromer15 окт. 2012 г., 19:56
Это было бы приятно узнать. Надеюсь, что ответ не даетЭто связано с написанием вашей собственной модели.

Ответы на вопрос(2)

Решение Вопроса

анных? вам нужно что-то вроде этого:

/// <summary>
/// A custom model binder for boolean values. This behaves the same as the default
/// one, except it will resolve the value to false if it cannot be parsed.
/// </summary>
public class BooleanModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        //MVC checkboxes need specific handling in checked state
        if (string.Equals(valueResult.AttemptedValue, "true,false"))
        {
            AddToModelState(bindingContext, valueResult);
            return true;
        }

        bool parsed = false;
        if (Boolean.TryParse(valueResult.AttemptedValue, out parsed))
        {
            AddToModelState(bindingContext, valueResult);
            return parsed;
        }

        return false;
    }

    private static void AddToModelState(ModelBindingContext bindingContext, ValueProviderResult valueResult)
    {
        bindingContext.ModelState.Add(bindingContext.ModelName, new ModelState { Value = valueResult });
    }
}

//in Global.asax
protected void Application_Start()
{
    ...
    ModelBinders.Binders.Add(typeof(bool), new BooleanModelBinder());
}
 pkmiec15 окт. 2012 г., 22:41
Да, свойство IsAwesome будет связано с этим ModelBinder. Булевы свойства будут использовать это конкретное связующее, а остальная часть связывания модели будет идти обычным образом.
 Dusda17 окт. 2012 г., 01:34
Одно предупреждение, однако: эта привязка модели сломает флажки, поскольку по умолчанию помощники HTML отображают как флажок, так и скрытое поле ввода, что приводит к значению строки запроса "правда, ложь» если флажок установлен. Вы можете исправить это с помощью простого оператора if над строкой TryParse (). Я отправил редактирование ответа, но его почему-то отклонили: /.
 pkmiec17 окт. 2012 г., 21:58
Dusda спасибо за указание на этот флажок "вопрос».. Я всегда забываю об этом поведении MVC. Я только что отредактировал код, чтобы справиться с этим.
 Dusda16 окт. 2012 г., 23:11
Спасибо, Ду. Я понял, что яЯ должен был реализовать пользовательское связующее, но надеялся, что у MVC есть какой-нибудь темный угол, который позволил бы мне настроить стандартный по умолчанию. Ну что ж, это лучший подход.
 Gromer15 окт. 2012 г., 21:29
Ницца! Так что я'м, предполагая, что это связующее будет использоваться даже в сложном типе, который имеетbool имущество? Скажи у тебя естьclass car { public bool IsAwesome { get; set; } public string Name { get; set; } }  Было бы использовать связыватель по умолчанию для привязки кcar аргумент в моем методе действия, и использоватьBooleanModelBinder когда он сталкивается сIsAwesome данные поступают в запросе?

ию в catch.

Альтернативой может быть только проверка, является ли первая буква параметра 'T' или 'F', Это должно избежать многих проблем.

 Dusda15 окт. 2012 г., 20:56
Лучше было бы попробовать TryParse (), чем это, но я бы предпочел избегать реализации пользовательской проверки, подобной той, в действии контроллера, тем более, что у Rentler есть несколько интеграций с другими компаниями, и, таким образом, несколько действий контроллера I 'Я должен был покрыть.
 SamuelDavis17 окт. 2012 г., 03:35
Похоже, что это очень специфическая проблема, требующая конкретного решения. Я также не вижу никакой выгоды от TryParse для Try / Catch, поэтому не могу отстоять свой выбор по этому вопросу.

Ваш ответ на вопрос