asp.net-mvc-3 – .NET MVC 3自定义十进制?模型粘合剂

在我的模型中,我有以下小数?属性
public decimal? Budget { get; set; }

我意识到我需要一个小数的自定义模型绑定器,Haack在以下链接中提供:http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx.

修改了他的代码,这样如果传入的值确实包含货币符号和/或逗号,那么我将其剥离然后尝试将其转换为小数.这是有效的,但我的属性是一个可以为空的十进制类型,我也希望它不接受任何东西并沿着它的快乐方式移动到我的数据库中的该列插入一个null.现在它插入0.00.我知道我在代码中遗漏了一些内容,但我正在大脑冻结.

这是绑定码:

public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext)
{
    ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
    ModelState modelState = new ModelState { Value = valueResult };
    object actualValue = null;
    object newValue = null;
    try
    {
        if (!string.IsNullOrEmpty(valueResult.AttemptedValue))
        {
            newValue = valueResult.AttemptedValue.Replace("$","").Replace(",","");
        }

        actualValue = Convert.ToDecimal(newValue,CultureInfo.CurrentCulture);
    }
    catch (FormatException e)
    {
        modelState.Errors.Add(e);
    }

    bindingContext.ModelState.Add(bindingContext.ModelName,modelState);
    return actualValue;
}

再次,目标是有小数?像往常一样行事,但如果有一个包含货币符号和/或逗号的值,它可以转换为小数,然后返回.

谢谢

解决方法

在try块中,我认为你需要类似的东西
string valtocheck = valueResult.AttemptedValue;
if(valtocheck == string.Empty)
{
    actualValue = null;
}
else
{
    actualValue = Convert.ToDecimal(valtocheck.Replace("$",string.Empty),CultureInfo.InvariantCulture);
 }

在您的代码中,您始终将actualValue设置为ToDecimal()的结果.

相关文章

项目要求通过网站上传大文件,比如视频文件,通过摸索实现了文件分片来上传,然后后台进行合并。 使用了...
安装新版本的Nginx(vim /etc/yum.repos.d/nginx.repo) [nginx-stable] name=nginx stable repo baseu...
什么是 SignalR ASP.NET Core ASP.NET Core SignalR 是一种开放源代码库,可简化将实时 web 功...
在Windows下使用Docker,我们选择Docker Desktop这个软件,非常方便。 ## Docker Desktop介绍及安装 Do...
项目开始设计的是运行在windows下,所以一开始采用的是windows服务模式来获取多媒体文件信息,后来要求...
银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化、云计算、大数据、工业互联网时代对主...