【问题标题】:How do I allow empty value to be passed to MVC WebApi for a double type如何允许将空值传递给双精度类型的 MVC WebApi
【发布时间】:2014-05-21 14:36:03
【问题描述】:

我有一个简单的 WebApi 2.1 项目,当我发布并将非必需可为空字段(双精度类型)的值留空时收到模型状态错误。我想保留 xml 元素,但允许它为空。我曾假设使该字段可为空可以处理此问题,但相反,如果我在薪水留空的情况下发布,我会收到错误(如下所列)。如果我输入一个数字......例如<salary>32000</salary>,一切都会按预期工作。

如何允许可为空的 double 设置一个空白值并仍然通过模型验证?

我收到的错误:

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>

【问题讨论】:

  • This blog 可能会有所帮助 - 特别是它提到配置更新的部分"config.Formatters.XmlFormatter.UseXmlSerializer = true;"
  • 我确实有 config.Formatters.XmlFormatter.UseXmlSerializer = true;在我的 WebApiConfig 中。除非 值为空白,否则它可以很好地序列化和反序列化。
  • @user2315985 我在一个项目中遇到了同样的情况,作为快速修复,我只是将属性类型更改为字符串并稍后处理。它很脏但很快。我花了几个小时在这上面:(
  • 正如你所建议的,我倾向于将属性更改为字符串,但这似乎不是正确的做法......应该有一种方法可以在 webapi 中处理这个问题。

标签: c# asp.net-mvc validation asp.net-web-api


【解决方案1】:

如果您必须处理一个空的 Salary 节点(而不是缺少一个),我会将模型更改为以下内容:

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,因此无法验证我的代码。

然后,您必须在使用 Employe 实例时使用 SalaryAmount。原因是一个空的 XML 元素计算为 string.Empty;缺少的 XML 元素的计算结果为 null。 Double.Parse 不喜欢导致您的问题的空字符串。

我建议的另一件事是在处理金钱时不要使用浮点数;它引入了舍入和其他问题。我会把双精度换成小数。

【讨论】:

    【解决方案2】:

    如果 XML 为空白,我建议不要在 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>
    

    【讨论】:

    • 客户有一个现有的流程(他们不能改变),它生成包含所有元素(包括薪水)的 XML,因此我必须接受他们的 xml... 有时带有空白 有时包括工资。
    • 你能告诉我,如果你不包括 Salary 节点它可以工作吗?
    • 如果 被遗漏,它确实有效,但如果 被遗漏但为空,则无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多