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

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

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

我的创建视图如下所示:

 @model PortefeuilleViewModel @{ ViewBag.Title = "Create"; } 

Create

@using (Html.BeginForm()) { @Html.ValidationSummary(true)
PortefeuilleViewModel
@Html.LabelFor(model => model.Naam)
@Html.EditorFor(model => model.Naam) @Html.ValidationMessageFor(model => model.Naam)
@Html.LabelFor(model => model.Saldo)
@Html.EditorFor(model => model.Saldo) @Html.ValidationMessageFor(model => model.Saldo)

}

我的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”领域。 我想validation它如下:

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

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

任何帮助将不胜感激。 谢谢。

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

使用钱时的第一件事(我认为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()); 

在这个阶段,我们已经解决了服务器端validation问题。 就客户端validation而言,您可以使用Microsoft发布的jQuery全球化插件 。 Scott Hanselman也在博客上写过这篇文章。 因此,一旦安装它,您可以强制客户端文化并覆盖负责执行客户端validation的$.validator.methods.number方法:

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