情况
我有一个包含三列的表的 LINQ-TO-SQL 模型。通常的ID(身份,自动生成),然后是int类型的 A和varchar(MAX)类型的B。所有列都在数据库中定义为NOT NULL。
在WebForms页面上,我声明了一个绑定到项目的 DetailsView:
<asp:ValidationSummary runat="server" ShowModelStateErrors="true" />
<asp:DetailsView DataKeyNames="Id" runat="server" ItemType="test.MyTable"
SelectMethod="..." UpdateMethod="...">
<Fields>
<asp:DynamicField DataField="A" />
<asp:TemplateField>
<EditItemTemplate>
<asp:TextBox ID="B" runat="server" TextMode="MultiLine" Columns="80" Rows="8" Text="<%# BindItem.B %>" />
</EditItemTemplate>
<ItemTemplate>
<pre><asp:Label runat="server" Text="<%# Item.B %>" /></pre>
</ItemTemplate>
</asp:TemplateField>
</Fields>
</asp:DetailsView>
所有这些代码都在 ASP.NET 4.5 上的 Visual Studio 2012 中运行。
怎么了
到目前为止,一切都很好。更新和查看作品。当我输入无效值时,问题就开始了。对字段A使用 ""会在页面顶部显示一个很好的错误消息。耶!但是,当我使用 "" 作为字段B的值时,会发生这种情况:
public void DetailsView_UpdateItem(int id)
{
var item = db.MyTable.Where(row => row.Id==id).Single();
TryUpdateModel(item);
if (ModelState.IsValid)
db.SubmitChanges();
}
- 调用 UpdateItem 方法
- TryUpdateModel 工作并将表单值填充到item中。
- 调试时,我可以看到item.B为null,正如预期的那样
- 然后ModelState.IsValid返回true ?!?
- 对db.SubmitChanges()的调用失败并出现异常
问题
当数据模型指定B不能为null时,我不明白为什么ModelState.IsValid会返回true。有人可以解释一下吗?我究竟做错了什么?
解决方法
我尝试的一件事是通过包含以下代码向数据类添加数据注释。它没有用。
[MetadataType(typeof(MyTableMetadata))]
public partial class MyTable
{
}
public class MyTableMetadata
{
[Required]
[StringLength(255,MinimumLength=1)]
public string B { get; set; }
}
很明显,我可以在UpdateItem方法中手动检查null或者我可以添加一个 RequiredFieldValidator - 但我不想这样做。