7

在 Rentler,我们经常看到错误

System.FormatException,字符串未被识别为有效的布尔值

在我们的健康监测中。事实证明,我们的客户在将其复制/粘贴到其他地方时,似乎偶尔会截断 URL 的末尾。碰巧的是,布尔参数往往位于字符串的末尾,当客户通过某个社交网络共享它时,我们会收到错误报告。

https://{domain}/search?sid=17403777&nid=651&location=840065&propertytypecode=1& photosonly=fals

我们对所有东西都使用模型绑定,所以我不确定如何处理这个问题。我可以将属性更改为字符串并尝试在控制器操作中解析它,但这很草率。是否有任何简单、流畅的方法可以让模型绑定器使用 TryParse() 并且如果不能则解析为 false ?

4

2 回答 2

1

布尔数据类型的自定义模型绑定器怎么样?你需要这样的东西:

/// <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());
}
于 2012-10-15T18:14:30.200 回答
0

你总是可以添加一个 try/catch 块并在 catch 中有一个默认值。

另一种方法是仅检查参数的第一个字母是“T”还是“F”。这应该可以避免很多问题。

于 2012-10-15T18:46:55.530 回答