为强类型模型中的特定属性定制模型绑定
本文关键字:模型 属性 绑定 强类型 | 更新日期: 2023-09-27 18:18:19
我可以使用自定义模型绑定器将0
和1
绑定到false
和true
:
[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
}