Как разрешить передачу пустого значения в MVC WebApi для двойного типа

1

У меня есть простой проект 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>
Теги:
validation
asp.net-mvc
asp.net-web-api

2 ответа

1
Лучший ответ

Если вам нужно обработать пустой Зарплатный узел (в отличие от отсутствующего), я бы изменил модель на следующее:

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 на десятичное.

1

Я предлагаю, пожалуйста, не включать узел зарплаты в 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>
  • 0
    У клиента есть существующий процесс (он не может измениться), который генерирует XML со всеми элементами (включая зарплату), и поэтому я должен принять их xml ... иногда с пустым <salary>, а иногда с включенным окладом.
  • 0
    Можете ли вы сообщить мне, что, если вы не включите узел Зарплата, он работает?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню