这是因为您的QuoteQuantity 是int,目前不是Nullable,所以当您尝试验证时,该字段不能为空,因为它不允许nulls。
解决这个问题的两种方法:
- 将
QuoteQuantity int 设置为int? (Nullable int)
或
- 使用不同的属性将值作为
string 接受,并在get 中为QuoteQuantity 使用int.TryParse 以查看字符串是否可以转换为int。 您需要进行某种检查,但要查看它是否在您的最小/最大范围内 - 如果您有的话
示例:
第一个建议:
public int? QuoteQuantity { get; set; }
第二个建议:(如果字符串为空/null 或无效int,则返回0)
public int QuoteQuantity
{
get
{
int qty = 0;
if (!string.IsNullOrWhiteSpace(QuoteQuantityAsString))
{
int.TryParse(QuoteQuantityAsString, out qty);
}
return qty;
}
}
public string QuoteQuantityAsString { get; set; }
// You will then need to use the
// QuoteQuantityAsString property in your View, instead
我建议第一个选项,并确保您在使用QuoteQuantity 的位置进行null 检查:)
希望这会有所帮助!
编辑:
为了公平起见,我只是想到了另一种方法(可能比建议 2 更好)。 无论如何,我认为建议 1 仍然是最好的方法。
为了仅在用户确实在视图上的“报价数量”字符串输入中输入内容时返回验证:
查看:
-
在视图中,添加一个文本输入,允许用户输入数量(或不输入,视情况而定)并使用它来代替您当前的 QuoteQuantity 元素
给它一个id + name 之类的 quoteQty
像以前一样添加 ValidationFor,但将 quoteQty 名称作为第一个参数
控制器:
在您的控制器POST 方法中,接受string quoteQty 的另一个参数(以便此映射与您的视图中的name 相同)。这将从您的 HttpPost 中填充
之前检查您的(ModelState.IsValid),尝试将quoteQty 解析为int;如果没有,请为quoteQty 添加一个ModelError,并带有一条消息
然后,您的模型将返回验证错误并根据需要显示在页面上。
缺点是,这无法在客户端进行验证,因此服务器必须返回错误
像这样:
public ActionResult SendQuote(Model yourmodel,
string quoteQty)
{
if (!string.IsNullOrWhiteSpace(quoteQty))
{
if (!int.TryParse(quoteQty, out yourmodel.QuoteQuantity))
{
// If the TryParse fails and returns false
// Add a model error. Element name, then message.
ModelState.AddModelError("quoteQty",
"Whoops!");
}
}
...
// Then do your ModelState.IsValid check and other stuffs
}
并且只使用原始属性
public int QuoteQuantity { get; set; }
在您的模型中。 int 的默认值将是 0,如果您从未设置它。如果TryParse 失败,它也将值设置为0