asp.net-mvc-3 – MVC 3客户端验证,模型绑定十进制值和文化(不同的小数分隔符)

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-3 – MVC 3客户端验证,模型绑定十进制值和文化(不同的小数分隔符)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图让我的客户端验证(模型绑定)来支持不同的文化,我发现一个有趣的博客,我正在尝试实现这个主题.

http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx

波科

  1. public class Jogador
  2. {
  3. public int ID { get; set; }
  4.  
  5. public string Name { get; set; }
  6.  
  7. public decimal Salary { get; set; }
  8. }

我有我的自定义DecimalModelBinder类

  1. public class DecimalModelBinder : IModelBinder
  2. {
  3. public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext)
  4. {
  5. ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
  6. ModelState modelState = new ModelState {Value = valueResult};
  7.  
  8. object actualValue = null;
  9. try
  10. {
  11. actualValue = Convert.ToDecimal(valueResult.AttemptedValue,CultureInfo.CurrentCulture);
  12. }
  13. catch (FormatException e)
  14. {
  15. modelState.Errors.Add(e);
  16. }
  17.  
  18. bindingContext.ModelState.Add(bindingContext.ModelName,modelState);
  19. return actualValue;
  20. }
  21. }

我的web.config:





  1. <compilation debug="true" targetFramework="4.0">
  2. <assemblies>
  3. <add assembly="System.Web.Abstractions,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31BF3856AD364E35" />
  4. <add assembly="System.Web.Helpers,Version=1.0.0.0,PublicKeyToken=31BF3856AD364E35" />
  5. <add assembly="System.Web.Routing,PublicKeyToken=31BF3856AD364E35" />
  6. <add assembly="System.Web.Mvc,Version=3.0.0.0,PublicKeyToken=31BF3856AD364E35" />
  7. <add assembly="System.Web.WebPages,PublicKeyToken=31BF3856AD364E35" />
  8. </assemblies>
  9. </compilation>
  10.  
  11. <authentication mode="Forms">
  12. <forms loginUrl="~/Account/logon" timeout="2880" />
  13. </authentication>
  14.  
  15. <pages>
  16. <namespaces>
  17. <add namespace="System.Web.Helpers" />
  18. <add namespace="System.Web.Mvc" />
  19. <add namespace="System.Web.Mvc.Ajax" />
  20. <add namespace="System.Web.Mvc.Html" />
  21. <add namespace="System.Web.Routing" />
  22. <add namespace="System.Web.WebPages"/>
  23. </namespaces>
  24. </pages>









Global.asax被改变为使用我的自定义ModelBinder十进制和十进制?值

  1. protected void Application_Start()
  2. {
  3. AreaRegistration.RegisterAllAreas();
  4.  
  5. ModelBinders.Binders.Add(typeof(decimal),new DecimalModelBinder());
  6. ModelBinders.Binders.Add(typeof(decimal?),new DecimalModelBinder());
  7.  
  8. RegisterGlobalFilters(GlobalFilters.Filters);
  9. RegisterRoutes(RouteTable.Routes);
  10. }

仍然在我的视图中,使用“,”作为小数分隔符输入的十进制的客户端验证失败.它不处理“,”和“.”. js验证似乎没有考虑到我的自定义绑定

一遍又一遍地阅读博客文章,我似乎无法弄清楚我失踪了什么.

这是视图:

  1. @model MVC_Empty.Web.Models.Jogador
  2.  
  3. @{
  4. ViewBag.Title = "Create";
  5. }
  6.  
  7. <h2>Create</h2>
  8.  
  9. <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
  10. <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
  11.  
  12. @using (Html.BeginForm()) {
  13. @Html.ValidationSummary(true)
  14. <fieldset>
  15. <legend>Jogador</legend>
  16.  
  17. <div class="editor-label">
  18. @Html.LabelFor(model => model.Name)
  19. </div>
  20. <div class="editor-field">
  21. @Html.EditorFor(model => model.Name)
  22. @Html.ValidationMessageFor(model => model.Name)
  23. </div>
  24.  
  25. <div class="editor-label">
  26. @Html.LabelFor(model => model.Salary)
  27. </div>
  28. <div class="editor-field">
  29. @Html.EditorFor(model => model.Salary)
  30. @Html.ValidationMessageFor(model => model.Salary)
  31. </div>
  32.  
  33. <p>
  34. <input type="submit" value="Create" />
  35. </p>
  36. </fieldset>
  37. }
  38.  
  39. <div>
  40. @Html.ActionLink("Back to List","Index")
  41. </div>

服务器端验证似乎很好,但是如何处理客户端验证,以便在点击提交按钮时发送POST.

JavaScript验证不处理逗号.

解决方法

最后,通过了解Custom DecimalModelBinder只处理服务器端验证,并且不影响处理客户端验证的jquery.validate.js,我找到了一个解决问题的方法.

扩展验证解决了我的问题.

通过新的.js文件扩展验证,作为解决方法的问题:

  1. $.validator.methods.number = function(value,element) {
  2. return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/ .test(value);
  3. };

这个博客真的很有帮助
http://rebuildall.umbraworks.net/2011/03/02/jQuery_validate_and_the_comma_decimal_separator

猜你在找的asp.Net相关文章