Tôi đang cố gắng xác thực phía khách hàng của mình (mô hình ràng buộc) để hỗ trợ các nền văn hóa khác nhau và tôi tìm thấy một blog thú vị về chủ đề mà tôi đang cố gắng triển khai.Xác thực phía máy khách MVC 3, giá trị thập phân và giá trị thập phân của mô hình (dấu tách thập phân khác nhau)
http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx
Poco
public class Jogador
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Salary { get; set; }
}
Tôi đã có DecimalModelBinder lớp tùy chỉnh của tôi
public class DecimalModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
ModelState modelState = new ModelState {Value = valueResult};
object actualValue = null;
try
{
actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture);
}
catch (FormatException e)
{
modelState.Errors.Add(e);
}
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
return actualValue;
}
}
web.config của tôi:
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</assemblies>
</compilation>
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>
<pages>
<namespaces>
<add namespace="System.Web.Helpers" />
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages"/>
</namespaces>
</pages>
Global.asax được thay đổi để sử dụng ModelBinder tùy chỉnh của tôi trên thập phân và thập phân? giá trị
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder());
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Vẫn xác thực phía máy khách không thành công được nhập vào dấu thập phân của tôi bằng dấu "," làm dấu phân cách thập phân. Nó không xử lý cả "," và ".". Việc xác thực js dường như không có ràng buộc tùy chỉnh của tôi khi xem xét
Đọc lại bài viết trên blog, tôi dường như không thể tìm ra những gì tôi đang thiếu.
Dưới đây là quan điểm:
@model MVC_Empty.Web.Models.Jogador
@{
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>Jogador</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Salary)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Salary)
@Html.ValidationMessageFor(model => model.Salary)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
Server side validation có vẻ tốt đẹp, nhưng làm thế nào để xử lý các xác nhận client-side để gửi một POST khi nhấp vào nút gửi.
Xác thực javascript không xử lý dấu phẩy. phiên bản
Bạn vẫn cần DecimalModelBinder một khi bạn mở rộng xác nhận? – Romias
Có, bạn có. Nếu không thì ModelBinder (phía máy chủ) sẽ thêm Lỗi. Trong thực tế, bạn có thể làm chỉ với DecimalModelBinder, nếu bạn không muốn xác thực trước POST. – Kman
Cảm ơn bạn đã giải quyết nó và cảm ơn bạn đã đăng giải pháp –