У меня есть простой проект WebApi 2.1, и я получаю ошибку состояния модели, когда я отправляю сообщение и оставляю значение для необработанного поля с нулевым значением (двойным типом). Я хочу оставить элемент xml, но пусть он будет пустым. Я предположил, что поле nullable будет обрабатывать это, но вместо этого, если я публикую с оставленной зарплатой, я получаю ошибку (указанную ниже). Если я ставлю номер в... например <salary>32000</salary>
все будет работать так, как ожидалось.
Как я могу разрешить пустое значение для валидации модели с двойным и все еще пропущенным значением?
Ошибка, которую я получаю:
System.Web.Http.ModelBinding.ModelError: "В документе XML есть ошибка (1, 111)".
Моя модель:
public class Employee
{
[Required]
public string LastName { get; set; }
public string MiddleName { get; set; }
[Required]
public string FirstName { get; set; }
public double? Salary { get; set; }
}
Мой метод управления контроллером:
public HttpResponseMessage Post([FromBody]Employee employee)
{
if (ModelState.IsValid)
{
string firstName = employee.FirstName;
string lastName = employee.LastName;
if (employee.Salary != null)
{
double? salary = employee.Salary;
}
return Request.CreateResponse(HttpStatusCode.OK);
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.NoContent, ModelState);
}
}
Вот мой фактический пост (с указанными заголовками):
Content-Type: application/xml
Accept-Language: en-us
Accept: application/xml
<Employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<LastName>Charlie</LastName>
<MiddleName>Bravo</MiddleName>
<FirstName>Alpha</FirstName>
<Salary></Salary>
</Employee>
Если вам нужно обработать пустой Зарплатный узел (в отличие от отсутствующего), я бы изменил модель на следующее:
public class Employee
{
[Required]
public string LastName { get; set; }
public string MiddleName { get; set; }
[Required]
public string FirstName { get; set; }
public string Salary { get; set; }
public double? SalaryAmount
{ get
{
if (string.IsNullOrEmpty(Salary)) return null;
return double.parse(Salary);
}
]
}
Отказ от ответственности: у меня нет поддержки VS, поэтому я не смог проверить свой код.
Затем вы должны использовать SalaryAmount, когда вы используете экземпляр Employe. Причиной этого является пустой XML-элемент, который вычисляется как string.Empty; отсутствующий элемент XML оценивается как null. Double.Parse не любит пустые строки, что является причиной вашей проблемы.
Еще одна вещь, которую я бы рекомендовал, - не использовать плавающие точки при работе с деньгами; он вводит округление и другие проблемы. Я бы изменил значение double на десятичное.
Я предлагаю, пожалуйста, не включать узел зарплаты в XML, если он пуст. Попробуйте, и тогда он должен работать.
Попробуйте следующее: пользователь xsi: nil = "true"
Content-Type: application/xml
Accept-Language: en-us
Accept: application/xml
<Employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<LastName>Charlie</LastName>
<MiddleName>Bravo</MiddleName>
<FirstName>Alpha</FirstName>
<Salary xsi:nil="true"></Salary>
</Employee>