У меня есть собственный модальный класс, который содержит десятичный член и представление, чтобы принять запись для этого класса. Все работало хорошо, пока я не добавил javascripts для форматирования номера внутри элемента управления вводом. Формат формата форматирует введенный номер с помощью разделителя тысяч "," при размытии фокуса.
Проблема заключается в том, что десятичное значение внутри моего модального класса не связывается и не разбирается с тысячным разделителем. ModelState.IsValid возвращает false, когда я тестировал его с "1,000.00", но он действителен для "100.00" без каких-либо изменений.
Не могли бы вы поделиться со мной, если у вас есть решение для этого?
Спасибо заранее.
Пример класса
public class Employee
{
public string Name { get; set; }
public decimal Salary { get; set; }
}
Контроллер образцов
public class EmployeeController : Controller
{
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult New()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult New(Employee e)
{
if (ModelState.IsValid) // <-- It is retruning false for values with ','
{
//Subsequence codes if entry is valid.
//
}
return View(e);
}
}
Пример просмотра
<% using (Html.BeginForm())
{ %>
Name: <%= Html.TextBox("Name")%><br />
Salary: <%= Html.TextBox("Salary")%><br />
<button type="submit">Save</button>
<% } %>
Я попробовал обходное решение с Custom ModelBinder, как предложил Александр. Задача решена. Но решение не подходит для реализации IDataErrorInfo. Значение зарплаты становится нулевым, если 0 введено из-за проверки. Любое предложение, пожалуйста? Члены команды Asp.Net MVC приходят в stackoverflow? Могу ли я немного помочь вам?
Обновленный код с настраиваемой моделью Binder, как предложил Александр
Модель Binder
public class MyModelBinder : DefaultModelBinder {
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
if (bindingContext == null) {
throw new ArgumentNullException("bindingContext");
}
ValueProviderResult valueResult;
bindingContext.ValueProvider.TryGetValue(bindingContext.ModelName, out valueResult);
if (valueResult != null) {
if (bindingContext.ModelType == typeof(decimal)) {
decimal decimalAttempt;
decimalAttempt = Convert.ToDecimal(valueResult.AttemptedValue);
return decimalAttempt;
}
}
return null;
}
}
Класс сотрудников
public class Employee : IDataErrorInfo {
public string Name { get; set; }
public decimal Salary { get; set; }
#region IDataErrorInfo Members
public string this[string columnName] {
get {
switch (columnName)
{
case "Salary": if (Salary <= 0) return "Invalid salary amount."; break;
}
return string.Empty;
}
}
public string Error{
get {
return string.Empty;
}
}
#endregion
}