填充模型时,格式错误的整数输入不会导致错误

时间:2018-09-10 23:16:40

标签: c# asp.net-mvc model-binding

对于具有将对象列表作为属性的MVC模型,如果无法将为整数属性提交的值解析为整数,则MVC 5(并且至少追溯到3)不会引发错误。 / p>

MCVE

以下示例代码演示了该问题:

C#:

using System.Web.Mvc;

namespace ModelBindingTest
{
    public class MyModel
    {
        public int NotNullValue { get; set; }
        public int? NullableValue { get; set; }
    }

    public class HomeController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            ViewBag.Method = "GET";
            return View(new MyModel()
            {
                NotNullValue = 999,
                NullableValue = 777,
            });
        }

        [HttpPost]
        public ActionResult Index(MyModel model)
        {
            ViewBag.Method = "POST";
            return View(model);
        }
    }
}

Home.cshtml:

@model ModelBindingTest.MyModel
@{
    Layout = null;
}

<!DOCTYPE html>

<html lang="en">    
<body>
    <form action="" method="POST">
        <label for="NotNullValue">NotNullValue:</label>
        <input id="NotNullValue" name="NotNullValue" value="@Model.NotNullValue">
        <label for="NullableValue">NullableValue:</label>
        <input id="NullableValue" name="NullableValue" value="@Model.NullableValue">
        <button type="submit">Save</button>
    </form>
    <p>HTTP Method: @ViewBag.Method </p>
</body>
</html>

大多数情况下,HTML便于查看发生的情况。也可以通过发布JSON进行复制。这些是我得到的结果:

  • 222 for NotNullValuemodel.NotNullValue222
  • 空白NotNullValuemodel.NotNullValue0
  • NotNullValue的字母(例如hre):model.NotNullValue0
  • 222 for NullableValuemodel.NullableValue222
  • 空白NullableValuemodel.NullableValuenull
  • NullableValue的字母(例如hre):model.NullableValuenull

请忽略以下事实:我正在同时为GETPOST请求使用模型对象。我没有在生产中这样做(尽管我已经看过了);这只是演示的简化。

目标

我希望MVC如果无法将输入解析为模型对象上指定的类型,则实际上会引发错误。这样的行为可以将无效值转换为有效值,从而导致持久存储客户端可能不想要的数据。

int?属性上字母的行为对我来说尤其成问题,因为我有一个字段需要允许null作为有效值。

我希望有400错误,但目前,任何错误都是一种改进。

我尝试过的事情

  • 更改模型以要求输入值。我得到“没有为此对象定义无参数构造函数”。错误,无论提交什么值。
  • 将输入类型更改为string并自己进行验证。当然。我可以做这个。我还可以丢弃整个MVC框架并使用其他东西。如果我走这条路,实际上没有必要使用强类型化的模型对象。
  • 将输入更改为方法参数。这几乎可以正常工作。它导致500响应,并显示错误消息“参数字典包含参数'NotNullValue'...的空条目”。但正如错误消息所暗示的那样,它不适用于int?。这在生产中也不可行,因为我的一些数据由长度未知的模型对象的列表组成,无论列表是模型属性还是方法,这些对象都会在单个项目上产生所描述的行为参数。

如何使MVC实际将解析错误视为错误?

ASP.NET Core MVC

我不知道该行为在Core MVC中是否有所不同。如果是这样,切换到Core对其他人可能是一个有用的答案(并且我不会拒绝投票),但目前对我而言不可行。因此,我正在寻找其他解决方法。

0 个答案:

没有答案