在此操作中,我可以使用a custom model binder将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
模型编写自定义模型绑定器,但我想要更通用的东西。
是否可以自定义绑定强类型模型的特定属性?
答案 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
}