为强类型模型中的特定属性定制模型绑定

本文关键字:模型 属性 绑定 强类型 | 更新日期: 2023-09-27 18:18:19

我可以使用自定义模型绑定器将01绑定到falsetrue:

[IntToBoolBinder]
public virtual ActionResult foo(bool someValue) {
}

但现在假设参数是强类型模型:

public class MyModel {
  public int SomeInt { get; set; }
  public string SomeString { get; set; }
  public bool SomeBool { get; set; }          // <-- how to custom bind this?
}
public virtual ActionResult foo(MyModel myModel) {
}

请求将包含int,而我的模型期望bool。我可以为整个MyModel模型编写一个自定义模型绑定器,但我想要更通用的东西。

是否可以自定义绑定强类型模型的特定属性?

为强类型模型中的特定属性定制模型绑定

如果你想为它做一个自定义绑定,可以像这样:

public class BoolModelBinder : DefaultModelBinder
{
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext,
                                         PropertyDescriptor propertyDescriptor)
    {
        if (propertyDescriptor.PropertyType == typeof(bool))
        {
            Stream req = controllerContext.RequestContext.HttpContext.Request.InputStream;
            req.Seek(0, SeekOrigin.Begin);
            string json = new StreamReader(req).ReadToEnd();
            var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
            string value = data[propertyDescriptor.Name];
            bool @bool = Convert.ToBoolean(int.Parse(value));
            propertyDescriptor.SetValue(bindingContext.Model, @bool);
            return;
        }
        else
        {
            base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
        }
    }
}

但是MVC和WebAPI int转换为bool(字段名必须相同),不需要任何额外的编写,所以我不知道你是否需要上面的代码。

试试这个演示代码:

public class JsonDemo
{
    public bool Bool { get; set; }
}
public class DemoController : Controller
{
    [HttpPost]
    public ActionResult Demo(JsonDemo demo)
    {
        var demoBool = demo.Bool;
        return Content(demoBool.ToString());
    }
}

发送JSON对象:

{
  "Bool" : 0
}