强类型模型中特定属性的自定义模型绑定

时间:2015-10-17 17:50:24

标签: c# asp.net asp.net-mvc model-binding

在此操作中,我可以使用a custom model binder01绑定到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模型编写自定义模型绑定器,但我想要更通用的东西。

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

1 个答案:

答案 0 :(得分:2)

如果要对其进行自定义绑定,可以如下所示:

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
}