我想在处理数字时扩展默认模型绑定以使其更加智能。当游戏中有逗号和小数点时,默认情况非常糟糕。
我正在尝试做一个新的活页夹
Public Class SmartModelBinder
Inherits DefaultModelBinder
Protected Overrides Sub SetProperty(controllerContext As ControllerContext, bindingContext As ModelBindingContext, propertyDescriptor As System.ComponentModel.PropertyDescriptor, value As Object)
If propertyDescriptor.PropertyType Is GetType(Decimal) Or propertyDescriptor.PropertyType Is GetType(Decimal?) Then
If value Is Nothing Then
value = 0
End If
End If
MyBase.SetProperty(controllerContext, bindingContext, propertyDescriptor, value)
End Sub
End Class
但此时已经转换了值
如何扩展活页夹以从表单中获取字符串值并执行不同的转换?
答案 0 :(得分:6)
这个怎么样?
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder())
自定义活页夹。我想我不知道你是否可以用这种方式覆盖十进制绑定,但它适用于我自己的类型。
public class DecimalModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (valueProviderResult == null)
{
return base.BindModel(controllerContext, bindingContext);
}
// to-do: your parsing (get the text value from valueProviderResult.AttemptedValue)
return parsedDecimal;
}
}
答案 1 :(得分:2)
您可能正在寻找的方法是BindModel
。以下是默认模型绑定器如何工作的高级概述,假设您有以下类:
public class MyModel
{
public int Id;
public string Name;
}
当MVC尝试将数据绑定到MyModel
时,它会在默认模型绑定器上调用BindModel
。该活页夹确定MyModel
不是“简单”数据类型(即int
,decimal
,string
等)。它然后拉出它可以绑定的可能成员,然后为每个类型找到正确的模型绑定器,并调用绑定器的BindModel
方法对字段/属性进行建模,因此复杂类型的模型绑定确实是递归电话。
通常我建议只为十进制编写一个模型绑定器并将其设置为该数据类型的模型绑定器,但我听说其他人有问题(我自己没有尝试过)。所以我会首先尝试,如果这不起作用,那么只需在默认模型绑定器的BindModel
方法中检查该模型类型并处理该特殊情况。
这是对模型绑定的极高级别概述,甚至不会开始暗示它是您需要了解的有关该区域如何工作的所有内容。
答案 2 :(得分:1)
我正在添加一个额外的答案,因为Phil Haack最近在博客上写到了如何做到这一点。他警告说这是未经测试的,但是他使用了ModelState
并在需要时添加了一个错误,这是我从未意识到何时/怎么做,所以这对我有帮助。
以下是其帖子的链接:http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx