【发布时间】:2012-08-29 16:54:33
【问题描述】:
情况
我有一个包含三列的表的 LINQ-TO-SQL 模型。通常的 ID(身份,自动生成),然后是 int 类型的 A 和 varchar 类型的 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 - 但我不想这样做。
【问题讨论】:
-
我不知道您甚至被“允许”将 WebForms 与 MVC 对象和方法混合使用。生活和学习!
-
@AnnL。它被称为模型绑定,在 ASP.net 4.5 中是新的:asp.net/vnext/overview/videos/aspnet-45-web-forms-model-binding
-
你确定过这个问题的原因吗?我遇到了同样的问题,但我已将其隔离为我为客户端 val 添加了RequiredFieldValidator。当我在页面上有此控件时,调用 ModelState.IsValid 始终返回 true,即使我在调用 ModelState.IsValid 之前手动将预期属性的值更改为 null。这可能听起来像一个奇怪的场景,但我在使用多层存储库时偶然发现了这一点。显然,标准的 Web 表单验证控件在某种程度上与模型绑定系统发生了冲突。
-
@John:最后我只是添加了一个RequiredFieldValidator,它适用于我的情况。
标签: asp.net linq-to-sql webforms model-binding