小数和整数的自定义模型活页夹:如何在MVC之前获取字符串值并进行更智能的转换

StackOverflow https://stackoverflow.com/questions/5320493

我想将默认模型绑定到处理数字时更为聪明。当逗号和小数在游戏中指向时,默认值非常糟糕。

我正在尝试做一个新的活页夹

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

但是该值此时已经转换

如何扩展活页夹以从表单中获取字符串值并执行不同的转换?

有帮助吗?

解决方案

那这个呢?

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;
    }
}

其他提示

您可能正在寻找的方法是 BindModel. 。这是默认模型粘合剂如何工作的高级概述,假设您有以下类:

public class MyModel
{
  public int Id;
  public string Name;
}

当MVC试图将数据绑定到 MyModel, ,它打电话 BindModel 在默认模型活页夹上。活页夹决定了 MyModel 不是“简单”的数据类型(即 int, decimal, string ETC)。然后,它拉出可能绑定到的可能成员,然后找到适合每种类型的模型粘合剂,并调用模型粘合剂的构造 BindModel 针对现场/属性的方法,因此复杂类型的模型绑定实际上是递归调用。

通常,我建议写一个模型活页夹仅用于小数,并将其设置为该数据类型的模型活页夹,但我听说其他人对此有问题(我自己没有尝试过)。因此,我会先尝试一下,如果那不起作用,请检查该模型类型 BindModel 默认模型活页夹的方法并处理该特殊情况。

这是模型绑定的极高级别概述,甚至没有开始暗示您需要了解该区域的工作方式。

我添加了其他答案,因为Phil Haack最近在Blog上发布了有关如何做到这一点的博客。他警告说这是未经测试的,但他利用了 ModelState 并在需要时添加一个错误,这是我从未意识到何时/如何做的事情,因此对我有帮助。

这是他帖子的链接: http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top