ASP.NET MVC3双重验证(逗号,点,null)

时间:2011-09-03 19:30:26

标签: c# asp.net-mvc validation

我的控制器看起来像这样:

 public class PortefeuilleController : Controller
    {
            public ActionResult Create()
            {
                return View(new PortefeuilleViewModel{Saldo = 0.0});
            }
    }

我的创建视图如下所示:

@model PortefeuilleViewModel

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>PortefeuilleViewModel</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Naam)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Naam)
            @Html.ValidationMessageFor(model => model.Naam)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Saldo)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Saldo)
            @Html.ValidationMessageFor(model => model.Saldo)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

我的PortefeuilleViewModel看起来像这样:

public class PortefeuilleViewModel
{
    [DisplayName("Naam")]
    [Required(ErrorMessage = "Gelieve een naam in te voeren")]
    public string Naam { get; set; }

    [DisplayName("Saldo")]
    public double Saldo { get; set; }
}

我的问题在于“Saldo”字段。我想验证它如下:

将字段保留为空应该是有效的(因为我的代码隐藏将“”更改为“0.0”并将该值保存在数据库中)。但是,例如,'19,99'和'19 .99'也应该作为有效传递。其余的都是无效的。

我真的不知道如何解决这个问题。我已经找到了这篇文章:http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx 但这根本没有解决(第二部分)我的问题......

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:22)

好的,所以你在2级激活验证:服务器端和客户端。我们首先处理服务器端验证问题。

使用money时的第一件事(我认为Saldo字段代表的是使用小数,而不是双精度数)。所以第一个改变是:

[DisplayName("Saldo")]
public decimal Saldo { get; set; }

好的,现在让我们根据您的情况调整一下Haacked模型绑定器(接受.,作为小数分隔符以及空值)

public class DecimalModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (string.IsNullOrEmpty(valueResult.AttemptedValue))
        {
            return 0m;
        }
        var modelState = new ModelState { Value = valueResult };
        object actualValue = null;
        try
        {
            actualValue = Convert.ToDecimal(
                valueResult.AttemptedValue.Replace(",", "."), 
                CultureInfo.InvariantCulture
            );
        }
        catch (FormatException e)
        {
            modelState.Errors.Add(e);
        }

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

当然会在Application_Start注册:

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());

在此阶段,我们已解决了服务器端验证问题。就客户端验证而言,您可以使用Microsoft发布的jQuery globalization plugin。斯科特汉塞尔曼也有blogged。因此,一旦安装它,您可以强制客户端文化并覆盖负责执行客户端验证的$.validator.methods.number方法:

$.validator.methods.number = function (value, element) {
    // TODO: return true or false if value is a valid decimal
}