Asp.net mvc 如果destinationId通过javascript设置为0,则ModelState.IsValid返回true

Asp.net mvc 如果destinationId通过javascript设置为0,则ModelState.IsValid返回true,asp.net-mvc,Asp.net Mvc,在锐利的视野中 public class InventoryEventViewModel{ public int DestinationId { get; set; } public int EventType { get; set; } } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Save(InventoryEventViewModel viewModel) { /

在锐利的视野中

public class InventoryEventViewModel{
      public int DestinationId { get; set; }
      public int EventType { get; set; }
}

[HttpPost]
 [ValidateAntiForgeryToken]
 public ActionResult Save(InventoryEventViewModel viewModel)
 {
           //added a breakpoint here

            if (!ModelState.IsValid)
            {
             //do something
             }
}
$'DestinationId'。val@Model.DestinationId->返回0


DestinationId的类型为int,因此其默认值为0。提交表单时,我在ActionResult行下方添加了一个断点以查看viewModel内容,发现viewModel.DestinationId为0,因此ModelState.IsValid返回true。但是,如果我删除这一行$'DestinationId'。val@Model.DestinationId,$'DestinationId'的默认值为空,但在我的断点viewModel.DestinationId仍然为0,但ModelState.IsValid返回false,我开始认为ModelState实际上并不是指viewModel的状态。那么这两者之间的关系是什么呢?

不清楚你在问什么。如果为DestinationId发布名称/值对,并且该值不是有效的int。例如,您选择了第一个值为Select Destination的选项,则ModelState将无效,因为您发布的值无效且无法设置为int,因此DestinationId将有其默认值。我的印象是ModelState实际上引用了viewModel,它验证了它的值,但情况似乎并非如此。即使我发布了一个空白的DestinationId,但稍后在ActionResult下面,我也会使用viewModel.DestinationId=0修复它;然后,它将是有效的,但它考虑了您试图从请求中设置的值。如果您提交(例如1),则它是有效的,因为它可以转换为int。如果您从请求中省略任何内容,或提交无效值,则ModelState将无效,但实际值将是其默认值。您的问题中没有关于这一点的任何内容:。但是,如果您需要某种条件验证,那么您可以使用应用于DestinationId属性的条件验证属性,并使其可为空-例如[RequiredIfNotEventType,2]public int?DestinationId{get;set;}您可以使用库,例如,或者如果您想学习编写自己的库,请从
<select name="DestinationId" id="DestinationId">
<option>Select Destination</option>
<option value="1">A</option>
<option value="2">B</option>
</select>