对于具有将对象列表作为属性的MVC模型,如果无法将为整数属性提交的值解析为整数,则MVC 5(并且至少追溯到3)不会引发错误。 / p>
以下示例代码演示了该问题:
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 NotNullValue
:model.NotNullValue
是222
。NotNullValue
:model.NotNullValue
是0
。NotNullValue
的字母(例如hre
):model.NotNullValue
是0
。222
for NullableValue
:model.NullableValue
是222
。NullableValue
:model.NullableValue
是null
。NullableValue
的字母(例如hre
):model.NullableValue
是null
。请忽略以下事实:我正在同时为GET
和POST
请求使用模型对象。我没有在生产中这样做(尽管我已经看过了);这只是演示的简化。
我希望MVC如果无法将输入解析为模型对象上指定的类型,则实际上会引发错误。这样的行为可以将无效值转换为有效值,从而导致持久存储客户端可能不想要的数据。
int?
属性上字母的行为对我来说尤其成问题,因为我有一个字段需要允许null
作为有效值。
我希望有400错误,但目前,任何错误都是一种改进。
string
并自己进行验证。当然。我可以做这个。我还可以丢弃整个MVC框架并使用其他东西。如果我走这条路,实际上没有必要使用强类型化的模型对象。int?
。这在生产中也不可行,因为我的一些数据由长度未知的模型对象的列表组成,无论列表是模型属性还是方法,这些对象都会在单个项目上产生所描述的行为参数。如何使MVC实际将解析错误视为错误?
我不知道该行为在Core MVC中是否有所不同。如果是这样,切换到Core对其他人可能是一个有用的答案(并且我不会拒绝投票),但目前对我而言不可行。因此,我正在寻找其他解决方法。