【发布时间】:2015-03-26 12:07:22
【问题描述】:
出于某种原因,我的控制器中的ModelState.IsValid 检查返回 true,即使我的实体和视图模型属性在字段上具有 [Required] 属性为 0。
这是实体:
public class Ticket
{
public int Id { get; set; }
[Required]
public int FareId { get; set; }
public virtual Fare Fare { get; set; }
}
以及我的视图使用的视图模型:
public class BaseTicketViewModel
{
[Required, Display(Name = "Fare")]
public int FareId { get; set; }
public Fare Fare { get; set; }
}
在我看来,我使用了许多单选按钮而不是下拉列表,这可能是导致问题的原因,我只是不知道如何:
<div class="form-group">
@Html.LabelFor(model => model.FareId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@foreach (FareGroup fareGroup in Model.FareList)
{
<h5><strong>@fareGroup.Name</strong></h5>
foreach (Fare fare in fareGroup.Fares)
{
<label class="checkbox-inline">
@Html.RadioButtonFor(model => model.FareId, fare.Id)
@fare.Name
</label>
}
}
@Html.ValidationMessageFor(model => model.FareId, "", new { @class = "text-danger" })
</div>
</div>
当我在未选择票价的情况下提交表单时,我的控制器会引发 DbUpdateException,它告诉我 INSERT 语句与 FOREIGN KEY 约束冲突,基本上是 ID 为 0 的 Fare 不存在:
{"INSERT 语句与 FOREIGN KEY 约束冲突 “FK_dbo.Tickets_dbo.Fares_FareId”。数据库发生冲突 “已编辑”,表“dbo.Fares”,列 'Id'。\r\n语句已终止。"}
据我了解,如果 viewmodel/ticket 实体上的 FareId 属性为 0,那么由于该属性上的 [Required] 注释,ModelState.IsValid 应该为 false?
【问题讨论】:
-
粘贴控制器的代码。
-
0是一个有效的整数。由于int不能为空,您将始终通过Required测试。你想要一个int?,或者一个可以为空的int。 -
那么 0 仍然是一个值。当它说Required时意味着它不能为Null。
标签: c# asp.net-mvc entity-framework validation asp.net-mvc-5